java - 这种并发相关的类怎么调用呢?是否有标准实现?

标签 java scala concurrency

因为我找不到它的标准实现,所以我创建了这个小类,但我认为一些简单的东西应该已经存在于某处:

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
    }
}

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

所以我的问题是:

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

最佳答案

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

这个 Scala REPL session 演示了它是如何工作的:

scala> import concurrent._           
import concurrent._

scala> import ops._                  
import ops._

我正在导入 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) }

我正在生成另一个线程。 get 阻塞,直到 syncInt 中有一个值。

scala> syncInt.isSet
res1: Boolean = false

scala> syncInt.set(103)

scala> got 103

上面已经被我们之前创建的线程打印出来了。

scala> syncInt.isSet
res3: Boolean = true

scala> syncInt.get
res4: Int = 103

关于java - 这种并发相关的类怎么调用呢?是否有标准实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989753/

相关文章:

c++ - 如果我们使用内存防护来增强一致性,那么 “thread-thrashing”会如何发生?

java - 仅当模式中存在空格时,后缀数字文字的 DateTimeFormatter 模式才有效

java - Pyspark 列表到 Scala 序列

java - 有没有办法让对象只能由访问特定方法的第一个线程使用?

scala - 你能为抽象类型指定一个 View 吗?

scala - 如何从scala的列表中按类型查找项目?

multithreading - 使用 HT 在一个 Core 上执行的线程之间的数据交换将使用什么?

java - hibernate 与 master 值一对一保存

java - 嵌套泛型继承

java - 如何在Android中获取带有按钮的项目信息