我正在实践 Goetze 的 Java 并发性,并且在不使用同步关键字时停留在共享变量的内存可见性部分。
代码如下
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while(!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args){
new ReaderThread().start();
number=42;
ready=true;
}
}
作者说这个类可能会永远循环,因为ready的值可能永远不会对读者线程可见。
我不明白这个说法。
我的看法是,首先主线程启动并将数字和准备设置为 true。但是另一个线程有自己的堆栈以及自己的 number 和 read 值,这些值不与主内存同步,并且这两个线程只有自己的变量副本。
现在,读者线程应该永远保持在循环中。我想知道为什么该Thread.yield变量不会屈服于主线程,然后主线程应该刷新到主内存,然后读取线程应该拾取这个新值并终止循环并打印正确的值,因为这也应该是已同步。
所以我想我有一些问题。
CPU 缓存中的值多久与主内存刷新/同步一次?
值可以不与主存同步吗?这也是可能的吗?
为什么会出现这种情况呢?
当只有一个 cpu 核心和一个 cpu 缓存时,这种内存可见性是否也会发生,还是总是发生?
尽管我了解竞争条件和死锁,但我在理解内存可见性问题时遇到了一些困难。这是架构特定的东西吗?
慕村225694
慕妹3242003
相关分类