如何理解一致性发生之前
在JLS的第17章中,它引入了一个概念:先发生,然后再一致。
如果对于 A 中的所有读取 r,其中 W(r) 是 r 看到的写入操作,则一组操作 A 在一致之前发生,则不是 hb(r, W(r)) 或 A 中存在写入 w 的情况,使得 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;
根据发生在一致性之前的定义,不难理解这个执行顺序是发生在一致之前(如果我的第一个理解是正确的)。所以我的第五个和第六个问题是:在现实世界中,这种情况是否存在(读取看到稍后发生的写入)?如果是这样,你能给我一个真实的例子吗?