我们可以将Java中的最终重新排序规则视为偶发规则吗?
Java中存在两个最终记录规则:
a write to final field in constructor
和the constructed instance reference is assigned to variable afterwards
无法重新排序read a instance reference
和read the final field in the instance afterwards
无法重新排序
我们能把以上规则当作规则之前发生的事情吗
a write to final field in constructor
发生在the constructed instance reference is assigned to variable afterwards
之前read a instance reference
发生在read the final field in the instance afterwards
之前
我认为在规则更具语义之前发生
# 1 楼答案
最后,在我的理解中,final关键字和before规则的语义保证属于不同的类别。上述推导是错误的,没有必要的
# 2 楼答案
在这种情况下,最终的重新排序规则肯定更为严格:
发生在之前的规则不禁止对语句进行局部重新排序,前提是重新排序后的行为是顺序一致的;i、 e.仅从创建对象的线程的角度
相比之下,最终的重新排序规则明确禁止构造函数中的某些重新排序,除了那些会违反顺序一致性的规则之外
推论:HB不包含最终的重新排序规则
(如果是这样的话,那么就根本没有必要说明后者。但是JLS的作者并不是为了见鬼才添加这些东西的。给他们和其他成千上万读过/研究过这些东西的人一些学分。)
设计目标是,在没有任何显式同步或内存模型相关性能开销的情况下,可以从任何线程使用
final
字段;i、 e.阅读时没有记忆障碍如果构造函数中允许对
final
字段进行本地重新排序,那么另一个线程将需要一个内存屏障,以确保它看到受影响字段的一致值。我想不出一个实用的方法来优化它。在构造函数中不重新排序的潜在小影响(平均而言)小于字段每次读取的读取屏障的影响