当我读到“实践中的java并发”c03时,我对以下程序感到困惑:
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;
}
}
由于重新排序和线程可见性,循环可能永远不会停止,或者输出可能为零,但我已尝试多次,输出始终为42。 所有的原因是我太幸运了?
答案 0 :(得分:9)
所有原因都是我太幸运了?
不一定。它还取决于您的处理器架构和JVM实现。这是微妙的记忆模型问题的一个问题:它们很难在野外繁殖。