有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我们可以将Java中的最终重新排序规则视为偶发规则吗?

Java中存在两个最终记录规则:

  1. a write to final field in constructorthe constructed instance reference is assigned to variable afterwards无法重新排序
  2. read a instance referenceread the final field in the instance afterwards无法重新排序

我们能把以上规则当作规则之前发生的事情吗

  1. a write to final field in constructor发生在the constructed instance reference is assigned to variable afterwards之前
  2. read a instance reference发生在read the final field in the instance afterwards之前

我认为在规则更具语义之前发生


共 (2) 个答案

  1. # 1 楼答案

    最后,在我的理解中,final关键字和before规则的语义保证属于不同的类别。上述推导是错误的,没有必要的

  2. # 2 楼答案

    I think happens-before rule is stronger semantic.

    在这种情况下,最终的重新排序规则肯定更为严格:

    • 发生在之前的规则不禁止对语句进行局部重新排序,前提是重新排序后的行为是顺序一致的;i、 e.仅从创建对象的线程的角度

    • 相比之下,最终的重新排序规则明确禁止构造函数中的某些重新排序,除了那些会违反顺序一致性的规则之外

    推论:HB不包含最终的重新排序规则

    (如果是这样的话,那么就根本没有必要说明后者。但是JLS的作者并不是为了见鬼才添加这些东西的。给他们和其他成千上万读过/研究过这些东西的人一些学分。)


    设计目标是,在没有任何显式同步或内存模型相关性能开销的情况下,可以从任何线程使用final字段;i、 e.阅读时没有记忆障碍

    如果构造函数中允许对final字段进行本地重新排序,那么另一个线程将需要一个内存屏障,以确保它看到受影响字段的一致值。我想不出一个实用的方法来优化它。在构造函数中不重新排序的潜在小影响(平均而言)小于字段每次读取的读取屏障的影响