Ser*_*gio 10 java concurrency multithreading volatile
我在这个网站上发现了一些有趣的问题(例如,这个)关于Java中的volatile变量的可见性效果,这些问题源于本段中的Java并发实践:
volatile变量的可见性效果超出了volatile变量本身的值.当线程A写入易失性变量并且随后线程B读取相同的变量时,在写入易失性变量之前,A可见的所有变量的值在读取volatile变量后变为B可见.因此,从内存可见性的角度来看,编写volatile变量就像退出synchronized块一样,读取volatile变量就像进入synchronized块一样.
然而,即使在阅读了本网站相关问题的答案后,我仍然无法完全清楚这种情况,具体而言:
线程A0在线程A 之前写入相同的volatile变量的影响是什么?换句话说:A0写入volatile变量,此值稍后由A(不读取变量)覆盖,然后由B读取.(所以我们有两个来自不同线程(A0和A)的写操作和一个来自第三个线程(B)的读操作).
我可以安全地假设A和B都能保证在A0写入volatile变量之前看到A0可见的所有内容吗?
更新:
这是关于Java内存模型的概念性问题.我知道我无法预测线程A0和A中的易失性变量的写入顺序以及线程B中的读取顺序.然而,仅仅为了便于讨论,让我们说 A0在A开始之前开始很多时间,并且在B开始另一个大量时间之后,让我们做出简化的假设,这足以保证写入和读取按所描述的顺序发生(我知道订单不能仅通过计时来保证,这只是为了避免偏离原始问题而进行的简化).
我可以安全地假设 A 和 B 都保证在 A0 写入 volatile 变量之前看到 A0 可见的所有内容吗?
写入易失性对象不会为线程提供任何有关读取的先发生保证。
读取时B,它会看到 A0 可以看到的任何内容,只要它看到它所做的更新。B还可以看到任何A可以看到的内容,只要它看到写入的值即可A。否则,B如果它读取的值不是来自该线程(即太早),则可能会看到比任一线程更旧的状态。
如果A0尝试先写入,则可能会在A例如A与数据的干净副本位于同一套接字上之后完成。它可以在之前访问它,A0因为后者将需要更长的时间来获取缓存行。最后完成的数据决定了数据的最终状态。