【发布时间】:2015-09-10 03:25:08
【问题描述】:
我对程序顺序以及它如何影响 JMM 中的重新排序有一些疑问。
在 Java 内存模型中,程序顺序 (po) 定义为程序中每个线程中操作的总顺序。根据JLS,这会导致发生前 (hb) 边缘:
如果
x和y是同一个线程的动作并且x出现在y之前 程序顺序,然后是 hb(x, y)(即xhappens-beforey)。
所以对于一个简单的程序P:
initially, x = y = 0
T1 | T2
-----------|-----------
1. r1 = x | 3. r2 = y
2. y = 1 | 4. x = r2
我认为 po(1, 2) 和 po(3, 4)。因此,hb(1, 2) 和 hb(3, 4).
现在假设我想重新排序其中一些语句,给我 P':
initially, x = y = 0
T1 | T2
-----------|-----------
2. y = 1 | 3. r2 = y
1. r1 = x | 4. x = r2
根据this paper,我们可以重新排序任何两个相邻的语句(例如 1 和 2),前提是重新排序不会消除任何有效执行中的任何传递前发生边缘。然而,由于 hb 由 po 定义(部分),而 po 是线程操作的总顺序,在我看来它在不违反 hb 的情况下重新排序任何两个语句是不可能的,因此 P' 不是合法的转换。
我的问题是:
- 我对 po 和 hb 的理解是否正确,我是否正确定义了 po 和 hb到上面的程序P?
- 我对 hb 失败的重新排序有何理解?
【问题讨论】:
标签: java multithreading concurrency java-memory-model