编程语言
首页 > 编程语言> > java – 如何理解发生 – 在一致之前

java – 如何理解发生 – 在一致之前

作者:互联网

chapter 17 of JLS,它引入了一个概念:发生 – 在一致之前.

A set of actions A is happens-before consistent if for all reads r in A, where W(r) is the write action seen by r, it is not the case that either hb(r, W(r)) or that there exists a write w in A such that w.v = r.v and hb(W(r), w) and 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都不是volatile字段.所以我的第四个问题是:我的理解是否正确?

在第二个执行顺序中:

1: r2 = A;  // sees write of A = 2

3: r1 = B;  // sees write of B = 1

2: B = 1;

4: A = 2;

根据事先一致性的定义,不难理解这种执行顺序是否发生 – 在一致之前(如果我的第一个理解是正确的).
所以我的第五个和第六个问题是:在现实世界中是否存在这种情况(读取后面会发生的写入)?如果确实如此,你能给我一个真实的例子吗?

解决方法:

每个线程可以在具有自己的缓存的不同核心上.这意味着一个线程可以写入存储在寄存器或其本地缓存中的值,并且该值在一段时间内对另一个线程不可见. (毫秒并不少见)

一个更极端的例子是读取线程的代码被优化,假设因为它永远不会改变值,所以它不需要从内存中读取它.在这种情况下,优化代码永远不会看到另一个线程执行的更改.

在这两种情况下,使用volatile确保读取和写入以一致的顺序发生,并且两个线程都看到相同的值.这有时被描述为始终从主存储器读取,但并非必须如此,因为缓存可以直接相互通信. (因此,性能影响远小于您的预期)

标签:memory-model,java
来源: https://codeday.me/bug/20190916/1808270.html