JLS中final-field-safe上下文的确切含义是什么?

时间:2014-09-09 08:12:36

标签: java final jls

术语最终字段安全上下文经常用于JLS第17.5.3段(后续修改最终字段)。虽然,从规范中可以理解(如果我在这里错了,请纠正我)

An implementation may provide a way to execute a block of code
in a final-fieldsafe context.

确切的行为取决于实现,仍然没有明确的术语定义。
我可以假设,如果我们有一个最终字段冻结 F (一个发生在对象构造的末尾或通过反射API设置的最终字段)和一个动作 A 发生在之前(F,A),然后 A 最终字段安全上下文

1 个答案:

答案 0 :(得分:7)

要了解JLS 17.5.3最终字段安全上下文的含义',请考虑以下代码

public static final AccountType SINGLETON_ACCOUNT_TYPE = new AwesomeAccountType();

在Java 5之前,Java有一个'功能'其中,开发人员认为AwesomeAccountType构造的线程安全性及其对SINGLETON_ACCOUNT_TYPE的分配是安全的。不幸的是,规范是模糊的和/或没有说明行为,这导致不同的JVM实现具有不同的行为。结果是Java在这种情况下通常不是线程安全和可移植的。

这样做的原因是,构造AwesomeAccountType所涉及的操作的顺序可以在运行时重新排序,使得在完全构造对象之前对对象的引用可以对另一个线程可见。这种行为是非确定性的,它总是在单核CPU上运行,并且通常在intel CPU上运行,但是在内存模型较弱的CPU(例如Dec Alpha)上会匆匆而过。

A'最终字段安全上下文'然后是上述最终字段(SINGLETON_ACCOUNT_TYPE)的赋值所涉及的代码区域,它涵盖了AwesomeAccountType的所有构造函数以及JVM内部用于分配和初始化对象内存的代码。

对Java内存模型的这些更改是在JSR133下进行的,以下常见问题解答对于理解所做更改的上下文非常有用:JSR133 FAQ