你怎么称这种并发相关的类?是否有标准实施?

Jen*_*der 5 java concurrency scala

由于我找不到它的标准实现,我创建了这个小类,但我认为这很简单,因为它应该存在于某个地方:

class ReturnValue {
    private var value = false

    private val latch = new java.util.concurrent.CountDownLatch(1)

    def setValue(aValue: Boolean) {
        value = aValue
        latch.countDown()
    }
    def getValue() = {
        latch.await
        value
    }
}
Run Code Online (Sandbox Code Playgroud)

它的目的是在两个线程之间交换一个值(在我的情况下是主线程+ EDT).从使用getValue()方法的代码看起来它几乎就像Future,但我发现Future实现期望调用者提供要执行的代码,这在我的情况下不起作用.

所以我的问题是:

  • 这样的东西有名字吗?
  • 在java或scala中是否有标准实现?
  • 我的实施是否正确?

Ale*_*rov 11

Scala标准库提供了这种类同步机制scala.concurrent.SyncVar[T].

此Scala REPL会话演示了它的工作原理:

scala> import concurrent._           
import concurrent._

scala> import ops._                  
import ops._
Run Code Online (Sandbox Code Playgroud)

我正在导入ops._Thread轻松生成另一个.

scala> val syncInt = new SyncVar[Int]
syncInt: scala.concurrent.SyncVar[Int] = scala.concurrent.SyncVar@17823918

scala> spawn { println("got %d" format syncInt.get) }
Run Code Online (Sandbox Code Playgroud)

我正在产生另一个线程.get阻止,直到有一个值syncInt.

scala> syncInt.isSet
res1: Boolean = false

scala> syncInt.set(103)

scala> got 103
Run Code Online (Sandbox Code Playgroud)

以上内容由我们之前创建的主题打印出来.

scala> syncInt.isSet
res3: Boolean = true

scala> syncInt.get
res4: Int = 103
Run Code Online (Sandbox Code Playgroud)


Vas*_*iuk 5

看起来有点类似于具有一个元素的同步队列,其中消费者必须等待生产者提供值.