Scala和Java内存模型

时间:2010-03-17 12:55:11

标签: scala concurrency final java-memory-model

Java内存模型(自1.5开始)将final字段与非final字段区别对待。特别是,如果this引用在构造期间没有转义,则构造函数中对final字段的写入保证在其他线程上可见,即使该对象通过另一个线程可用于其他线程数据竞赛。 (写入非final字段不保证是可见的,因此如果您不正确地发布它们,另一个线程可能会看到它们处于部分构造状态。)

是否有关于Scala编译器如何/如果为类创建final(而非非final)支持字段的文档?我查看了语言规范并搜索了网络,但找不到任何确定的答案。 (相比之下,记录了@scala.volatile注释 以将字段标记为volatile

3 个答案:

答案 0 :(得分:4)

我挖掘历史,找出改变的时间。

语言规范不涵盖Scala到JVM的投影。

答案 1 :(得分:3)

当您将某些内容声明为final时,它会创建一个val字段。任何可以修改其引用的内容(例如var)都可以(显然)不在final下面。

这意味着case classes也包含final字段(因为case类构造函数的参数是隐式的val s)

答案 2 :(得分:2)

我在Scala bug系统中为此提交了文档错误。