关于 JLS ch17线程和锁,它表示“如果一个操作发生在另一个操作之前,则第一个操作对第二个操作可见并且在第二个操作之前排序”;我想知道:
(1)“之前订购”到底是什么意思?因为即使action_a发生在action_b之前,在某些实现中action_a也可以在action_b之后执行,对吗?
(2) 如果action_a发生在action_b之前,是否意味着action_a不能看到action_b?或者action_a可能看到也可能看不到action_b?
(3) 如果action_a不发生在action_b之前,并且action_b也不发生在action_a之前,这是否意味着action_a可以看到或不可以看到action_b?
(4) 不可能有任何循环的happens-before,对吧?
任何答案将不胜感激:)
(1)“之前订购”到底是什么意思?因为即使action_a发生在action_b之前,在某些实现中action_a也可以在action_b之后执行,对吗?
发生在之前 is a causal, not a temporal关系。action_a
之前是因果顺序的action_b
,无论它是否实际上在它之前执行。然而,在实践中,如果没有时间顺序,运行时将很难维持因果关系。查看我之前的问题其中详细介绍了因果关系的主题。
(2) 如果action_a发生在action_b之前,是否意味着action_a不能看到action_b?或者action_a可能看到也可能看不到action_b?
动作之间的可见性有一个明确的总体顺序。这是由指定的部分处理的格式良好的执行。因此,对于任意两个动作a and b, 任何一个a可见b, or b to a,或者以上都不是。理解格式正确的执行概念的好书是Java 内存模型示例:好、坏和丑陋.
(3) 如果action_a不发生在action_b之前,并且action_b也不发生在action_a之前,这是否意味着action_a可以看到或不可以看到action_b?
是的,两者皆有可能。无论哪种方式都没有保证。
(4) 不可能有任何循环的happens-before,对吧?
发生在之前必须强制执行部分排序,而排序的关键属性是没有循环。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)