说“之前订购”是什么意思?因为即使action_a发生在action_b之前,在某些实现中action_a也可以在action_b之后执行,对吧?
A Happens before关系创建了一个内存屏障,阻止了 action-b 在 action-a 之前执行。因此无法应用一些底层 JVM 优化。因此,任何操作-a都不能在操作-b 之后或与操作-b 一起执行。
如果 action_a 发生在 action_b 之前,是否意味着 action_a 不能看到 action_b?或者 action_a 可能会看到或可能不会看到 action_b?
这意味着action-b必须看到action-a带来的所有变化。
如果 action_a 没有发生在 action_b 之前,并且 action_b 没有发生在 action_a 之前,这是否意味着 action_a 可能会看到或可能不会看到 action_b?
Happens-before是一种传递关系。因此,如果 action-a 发生在 action-b 之前,而 action-b 发生在 action-c 之前……以此类推直到 action-y,并且 action-y 发生在 action-z 之前,那么 action-a 发生在 action-z 之前。
发生在关系之前,确保跟随当前操作的操作将看到当前操作所做的更改。如果未看到更改,则不存在发生之前。
不可能有任何循环发生之前,对吧?
对,如果 action-a 发生在 action-b、action-c、action-d 之前,那么 b、c、d 中的任何一个都不会发生在 action-a 之前。
编辑 :
JLS 说应该注意的是,两个动作之间存在发生前的关系并不一定意味着它们必须在实现中按该顺序发生。如果重新排序产生与合法执行一致的结果,则不是非法的。. 因此,如果 action-a 与 action-b 有发生之前的关系,那么 action-b 可以先执行,前提是 final 等价于如果 action a 在 action b 之前执行的状态。这是特定于实现的。JIT 可能决定在操作 a 之前运行操作 b,前提是此顺序更改不会影响最终结果。
好吧,action-a独立于 action-b。至少理论上:)
发生在指定的顺序动作之前。如果动作是并行的,那么发生之前不存在。
注意:所有这些混淆都是因为如果两个动作之间没有依赖关系,JIT会删除之前发生的事情。请阅读逃逸分析。