JMM中的因果关系要求

时间:2016-03-19 17:14:26

标签: java multithreading memory concurrency

我试图了解JMM的因果关系要求。 JMM的这一部分描述了它https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.8

E在因果关系定义中意味着什么。这是否意味着执行我们试图证明或执行以证明从Ci到Ci + 1的提交是合理的。?

同样在因果关系定义的9条规则中,用于将A中的动作添加到从Ci-1到Ci或从Ci到Ci + 1的赋值动作集。

1 个答案:

答案 0 :(得分:1)

  

E在因果关系定义中意味着什么。这是否意味着执行我们试图证明或执行以证明从Ci到Ci + 1的提交是合理的。?

E 是您尝试确定的因果有效性的执行。

E i 是格式正确的执行,通过它可以处理因果关系,而不会引入总时间顺序的概念。

  

同样在因果关系定义的9条规则中,用于将A中的动作添加到从Ci-1到Ci或从Ci到Ci + 1的动作集。?

我不确定我是否理解你的问题。 我的回答尝试可能涉及重复您不感兴趣的内容,但请耐心等待。

根据第17.4.8节中的规则,如果所有操作都可以提交,则执行在Java内存模型的因果关系要求方面有效。

本节中的规则定义了可以通过建立规则集来提交的内容,该规则集用于从空集的已提交操作构建到最终执行的所有操作集。这是在离散的步骤中完成的,并且每个步骤的已提交操作都有一致性规则和不变量,以及它们与不同执行中上一步的已提交操作的关系( E vs < em> E i 从上面开始。)

根据定义,根据最后一条规则(第17.4.8节中第9个编号的项目符号)提交动作,每组 C i 是<的正确子集em> C i + 1 ,因此动作不会从 C i 提交到 C i + 1 ,但是从 A C i

我发现以下两个链接是清除JMM中因果关系迷雾的最佳资源:

  1. JMM Causality Test Cases
  2. Alexey Shipilev's JMM Pragmatics talk
  3. PS 对于那些没有关于规范这一部分的上下文的人来说,第17.4.8节的要点是弥合发生之前之间的差距一致的执行和 SC DRF (顺序一致,无数据竞争)执行。这两者之间的区别在于所谓的凭空缺失值,隐藏的部分17.4.8不允许这样做,如果不加以控制,可能会非常糟糕。