在JLS 的第 17 章中,引入了一个概念:happens-before 一致。
如果对于 A 中的所有读取 r,一组动作 A 在发生之前是一致的,其中 W(r) 是 r 看到的写入动作,但不是 hb(r, W(r)) 或存在在 A 中存在写入 w 使得 wv = rv 和 hb(W(r), w) 和 hb(w, r)"
在我的理解中,它等于下面的话:……,既不是……也不是……
所以我的前两个问题是:
- 我的理解正确吗?
- “wv = rv”是什么意思?
它还给出了一个例子:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
在第一个执行顺序中:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
命令本身已经告诉我们两个线程是交替执行的,所以我的第三个问题是:左数是什么意思?
据我了解,r2 和 r1 都可以看到初始写入 0 的原因是 A 和 B 都不是 volatile 字段。所以我的第四个问题是:我的理解是否正确?
在第二个执行顺序中:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
根据happens-before一致性的定义,不难理解这个执行顺序是happens-before一致(如果我的第一个理解是正确的)。所以我的第五个和第六个问题是:现实世界中是否存在这种情况(读后写)?如果是这样,你能给我一个真实的例子吗?