【发布时间】:2019-03-23 01:34:10
【问题描述】:
我有一个关于 JMM 和 Scala 期货的问题。
在下面的代码中,我有非不可变的 Data 类。我在一个线程内(在 Future 应用主体内)创建它的一个实例,然后订阅完成事件。
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object Hello extends App {
Future {
new Data(1, "2")
}.foreach { d =>
println(d)
}
Thread.sleep(100000)
}
class Data(var someInt: Int, var someString: String)
我们能否保证:
- foreach 主体从创建 Data 实例的同一线程调用?
- 如果不是,我们能否保证 Future.apply happens-before(就 JMM 而言)foreach 正文中的操作?
【问题讨论】:
-
Scala 规范是否声明 JMM 适用于 Scala 程序?
-
Holger,JMM 适用于任何运行在 JVM 上的应用程序
-
不,JMM 是 Java Language 规范的一部分。 JVM 必须符合它自己的规范,并且可以公平地假设,给定一个正确编译的 Java 应用程序,它在 JVM 上的执行将符合 JMM。但是,当我们不知道生成的字节码时,这并没有说明具有不同、未知语言结构甚至类似结构的任意编程语言。实际上,您的问题就是一个例子。只有 Scala 的规范才能回答这个问题。它必须指定的第一件事是 JMM 是否适用于它(以及如何适用)。
标签: scala concurrency jvm thread-safety future