我正在阅读关于内存模型的JLS规范,17.4.5发生-订货前。我不明白第一条规则:
"#如果x和y是同一个线程的动作,x按程序顺序放在y之前,则hb(x,y)。“
让我们假设A、A、B是可以在多个线程之间共享的对象(类对象的实例):
int i=A.getNum(); // ActionA
int j=B.getNum(); // ActionB三个问题:
发布于 2011-07-09 09:45:26
我的理解是:
会发生的--在恋爱关系没有提到任何关于重新排序的行动之前。它只说如果HB( A,B)保持不变,那么动作B必须看到动作A的记忆效果。
如果操作B没有使用操作A的任何结果,那么就没有理由不能重新排序它们。(一般来说,“使用另一个操作的任何结果”相当广泛,它只能用于相当简单的操作,如内存读写,而不能用于使用外部资源的操作,如I/O操作或基于时间的操作)
发布于 2011-07-09 09:49:19
是的,ActionA发生在ActionB之前。不过,请在那一节再读一读。这并不一定意味着JVM不能重新排序这些。这意味着ActionB必须观察ActionA的效果,仅此而已。如果ActionB从来不依赖于ActionA的效果,那就无关紧要了。
发布于 2011-07-09 09:48:53
你的理解基本上是正确的。然而,要记住的关键是:
这是java多线程编程中常见的错误和困惑的根源。
https://stackoverflow.com/questions/6633983
复制相似问题