在Java内存模型中发生在关系之前

在Java内存模型中发生在关系之前,java,jvm,jvm-hotspot,java-memory-model,happens-before,Java,Jvm,Jvm Hotspot,Java Memory Model,Happens Before,关于JLS ch17,它说“如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序”;我想知道: (1) 说“之前订购”是什么意思?因为即使动作a发生在动作b之前,在某些实现中动作a也可以在动作b之后执行,对吗 (2) 如果动作a发生在动作b之前,是否意味着动作a不能看到动作b?或者行动a可能看到或可能看不到行动b (3) 如果行动a不发生在行动b之前,而行动b不发生在行动a之前,这是否意味着行动a可能看到或可能看不到行动b (4) 以前不可能有循环发生的,对吧

关于JLS ch17,它说“如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序”;我想知道:

(1) 说“之前订购”是什么意思?因为即使动作a发生在动作b之前,在某些实现中动作a也可以在动作b之后执行,对吗

(2) 如果动作a发生在动作b之前,是否意味着动作a不能看到动作b?或者行动a可能看到或可能看不到行动b

(3) 如果行动a不发生在行动b之前,而行动b不发生在行动a之前,这是否意味着行动a可能看到或可能看不到行动b

(4) 以前不可能有循环发生的,对吧

如有任何答复,将不胜感激:)

说“之前订购”是什么意思?因为即使 动作a发生在动作b之前,动作a可以在动作b之后执行 在一些实施中采取行动,对吗

“A发生在关系之前”会创建一个内存屏障,阻止在“动作-A”之前执行“动作-b”。因此,一些底层JVM优化无法应用。因此,操作-a不能在操作-b之后或与操作-b一起执行

如果动作a发生在动作b之前,是否意味着动作a不能发生 看到行动了吗?或者行动a可能看到或可能看不到行动b

这意味着行动b必须看到行动a带来的所有变化

如果动作a不发生在动作b之前,且动作b不发生 发生在动作a之前,这是否意味着动作a可以看到或看不到 行动

“之前发生”是一种传递关系。所以,如果动作a发生在动作b之前,而动作b发生在动作c之前。。。所以一直到动作-y,动作-y发生在动作-z之前,然后动作-a发生在动作-z之前

“发生在之前”关系确保当前操作之后的操作将看到当前操作所做的更改。如果没有看到这些变化,那么之前发生的变化就不存在了

以前不可能有循环发生的,对吧

对,如果动作a发生在动作b,动作c,动作d之前,那么b,c,d中的任何一个都不能发生在动作a之前

编辑:

JLS表示,应该注意的是,两个动作之间存在“先发生后发生”关系并不一定意味着它们必须在实现中按该顺序发生。如果重新排序产生的结果与合法执行一致,则不违法。。因此,如果动作a与动作b之间存在“先发生后发生”关系,那么动作b可以先执行,前提是如果动作a在动作b之前执行,则最终结果与状态相等。这是特定于实现的。JIT可能会决定在操作a之前运行操作b,前提是顺序的更改不会影响最终结果

  • 动作a独立于动作b。至少理论上:)

  • 在指定连续操作之前发生。如果动作是并行的,那么之前发生的动作就不存在了

  • 注意:所有这些混淆都是因为如果两个操作之间没有依赖关系,JIT会删除之前发生的事件。请阅读

    (1) 说“之前订购”是什么意思?因为即使动作a发生在动作b之前,在某些实现中动作a也可以在动作b之后执行,对吗

    以前发生的事是因果关系,而不是暂时关系<代码>动作a按因果顺序排列在动作b之前,无论它是否实际在动作b之前执行。然而,在实践中,如果没有时间顺序,运行时将很难维护因果关系。检查一下关于因果关系的细节

    (2) 如果动作a发生在动作b之前,是否意味着动作a不能看到动作b?或者行动a可能看到或可能看不到行动b

    行动之间的可见性有一个明确的总体顺序。这由指定格式良好的执行的部分来处理。因此,对于任何两个动作a和b,要么a对b可见,要么b对a可见,要么以上都不可见。要理解格式良好的处决的概念,一本好的读物是

    (3) 如果行动a不发生在行动b之前,而行动b不发生在行动a之前,这是否意味着行动a可能看到或可能看不到行动b

    是的,两者都有可能。这两种方式都无法保证

    (4) 以前不可能有循环发生的,对吧


    之前发生的事件必须进行偏序,而排序的关键属性是无循环。

    我读过的最好的解释是莱斯利·兰波特的原稿:@midor Great paper;但这里我们谈论的是Java内存模型,而不是分布式系统:-是的,我们谈论的是Java,但“发生在”关系几乎涵盖了CS中并发操作发生的所有部分。恐怕它不是为Java重新定义的,如果是这样的话,我会非常惊讶。几乎所有的问题都是关于关系之前发生的,所以我仍然认为Lamport的论文是最好的参考。MIDor如果你仔细观察被问到的内容,你会发现OP不寻求在发生之前澄清发生的事情。而是JLS的具体规则如何防止循环因果关系等非自然结果。感谢您的快速回复。但是,对于(1),请参见;对于(2)行动b对行动a的影响如何?对于(3)传递性很好,但是“并行”操作(关系之前不发生)呢?@Kurtt.Lin-检查我的编辑。另外,检查Marko Toplonik的答案。他是教我逃避分析的人:PI不会将JITC的任何行为视为“消除以前发生的事情”,因为这是一种概念关系,其语义后果必须始终遵守。锁省略(我猜这就是你提到转义分析时的想法)不会删除relati之前发生的任何事件