2010-03-17 54 views
13

Java内存模型(自1.5)将final字段视为与非final字段不同。特别是,如果this引用在构造过程中不会转义,则在构造函数中写入final字段可保证在其他线程上可见,即使该对象可通过数据争用提供给其他线程。 (写于非final字段都不能保证是可见的,所以如果你不当发布它们,另一个线程可以看到他们在部分构造状态。)Scala和Java内存模型

是否有关于如何/如果Scala编译器创建的任何文件final(而不是非final)支持类的字段?我浏览了语言规范并搜索了网页,但找不到任何明确的答案。 (在比较@scala.volatile注释记录标记字段为volatile

回答

4

我透过历史挖出来找出变更时间。

斯卡拉进入JVM的投影未涵盖的语言规范。

+7

但是从并发的角度来看,语言结构的行为应该成为我会争辩的规范的一部分! –

3

它创建了一个final场当你声明的东西为val。任何可以修改引用的内容,例如var,都可以(明显)不在final之下。

这意味着case classes包含最终场也(为参数的情况下,类构造函数是隐式val S)

+1

我不认为这是过去的情况(例如,请参阅http://old.nabble.com/Val-and-Final-td13355515.html)。我的问题的部分原因 - 如果没有任何文档可以改变,我怎么知道它不会再改变? –

+1

你是对的,应该记录下来。这不仅仅是性能问题,而是由于内存模型造成的语言本身的一部分。我并不知道vals曾经是非最终的 –

2

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