【问题标题】:Scala and the Java Memory ModelScala 和 Java 内存模型
【发布时间】:2010-03-17 12:55:11
【问题描述】:

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

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

【问题讨论】:

    标签: scala concurrency final java-memory-model


    【解决方案1】:

    我翻阅了历史以找出更改的时间。

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

    【讨论】:

    • 但是,从并发的角度来看,语言结构的行为应该是我认为的规范的一部分!
    【解决方案2】:

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

    这意味着case classes 也包含最终字段(因为案例类构造函数的参数隐式为vals)

    【讨论】:

    • 我认为以前不是这种情况(例如,请参阅old.nabble.com/Val-and-Final-td13355515.html)。我的问题的部分原因 - 如果这可以在没有任何文档的情况下改变,我怎么知道它不会再次改变?
    • 你是正确的,这应该被记录下来。由于内存模型,这不仅仅是性能问题,而是语言本身的一部分。我不知道 vals 曾经是非最终的
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多