在JLS第17章中,它介绍了一个概念:happens-before一致。
如果对于A中所有的读操作r,其中W(r)是r所看到的写操作,则集合A是happens-before一致的,那么既不是hb(r,W(r))也不是存在一个写操作w属于A,使得w.v=r.v并且hb(W(r),w)和hb(w,r)“
根据我的理解,它相当于以下表述: … ,它不是hb(r,W(r))也不是存在一个写操作w属于A,使得w.v=r.v并且hb(W(r),w)和hb(w,r)
因此,我有两个问题:
- 我的理解正确吗?
- “w.v = r.v”是什么意思?
它还给出了一个示例: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都不是易失字段。因此,我的第四个问题是:我的理解是否正确?
在第二次执行顺序中:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
根据“先行发生一致性”的定义,很容易理解这个执行顺序是符合“先行发生一致性”的(如果我的第一个理解是正确的)。 那么我的第五和第六个问题是:在现实世界中是否存在此类情况(读取看到稍后发生的写入)?如果存在,请给我一个真实的例子。