理解JVM之前发生并重新排序

Ben*_* Xu 3 java jvm

我正在阅读关于内存模型的JLS规范,17.4.5在订单之前发生.我不明白第一条规则:

"#如果x和y是同一个线程的动作,x在程序顺序中出现在y之前,那么hb(x,y)."

假设A和B是可以在多个线程之间共享的对象(类对象的实例):

int i=A.getNum();  // ActionA
int j=B.getNum();  // ActionB
Run Code Online (Sandbox Code Playgroud)

三个问题:

  1. 根据上述规则,它是否意味着hb(ActionA,ActionB)

  2. 如果对1的答案为真,那么根据发生在 - 之前的规则是否意味着ActionB不能在任何遵循JSR133内存模型的JVM中重新排序到ActionA之前?

  3. 如果1和2都是真的,似乎ActionA和ActionB不相关,为什么不能重新排序呢?只是为了这个规格?

Pet*_*aný 9

我的理解是:

  1. 你是对的
  2. 它们可以重新排序,但前提是行动B不依赖于行动结果A.

事情之前 - 关系并没有说明重新排序行动.它只说如果HB(A,B)成立,那么行动B必须看到行动A的记忆效应.

如果操作B不使用任何操作A的结果,则没有理由不能重新排序.(通常,"使用其他操作的任何结果"非常广泛,只能通过内存读/写等非常简单的操作检测,而不能检测使用外部资源(如I/O操作)或基于时间的操作的操作)