我正在阅读关于内存模型的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)
三个问题:
根据上述规则,它是否意味着hb(ActionA,ActionB)?
如果对1的答案为真,那么根据发生在 - 之前的规则是否意味着ActionB不能在任何遵循JSR133内存模型的JVM中重新排序到ActionA之前?
如果1和2都是真的,似乎ActionA和ActionB不相关,为什么不能重新排序呢?只是为了这个规格?
我的理解是:
事情之前 - 关系并没有说明重新排序行动.它只说如果HB(A,B)成立,那么行动B必须看到行动A的记忆效应.
如果操作B不使用任何操作A的结果,则没有理由不能重新排序.(通常,"使用其他操作的任何结果"非常广泛,只能通过内存读/写等非常简单的操作检测,而不能检测使用外部资源(如I/O操作)或基于时间的操作的操作)
| 归档时间: |
|
| 查看次数: |
1171 次 |
| 最近记录: |