【问题标题】:'Happens before' on Scala constructors: final fieldsScala构造函数上的“发生在之前”:最终字段
【发布时间】:2021-08-29 15:40:43
【问题描述】:

Java 规范提到,只有 final 字段的类的构造函数与读取对该对象的任何引用的任何线程处于 happens-before 关系:换句话说,不可能应用程序来查看部分构造的对象。

Scala 通过将初始化提取到单独的方法来破解初始化,以确保在超类中的任何初始化代码之前设置“主构造函数 vals”。这至少是 Scala final val 不总是(或曾经?)转换为 Java final 字段的一个原因。

  1. 有没有办法实现这一点,即确保类客户端与其构造函数之间的happens-before关系?
  2. 哪个是编译器相当稳定的特性?
  3. 哪个不是用Java写的类?

【问题讨论】:

    标签: scala final java-memory-model happens-before


    【解决方案1】:

    Scala 通过将初始化提取到单独的方法来破解初始化,以确保在任何初始化代码之前设置“主构造函数 vals”在超类中

    在不会破坏final 保证的java 中,只要this 不会从构造函数中逃脱。
    (“不转义”表示构造函数的代码不会将this 存储在另一个线程可以读取的变量/集合/等中)

    另外因为JMM是defined for java language而不是JVM,恐怕它只适用于编译成java代码的语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2019-04-11
      相关资源
      最近更新 更多