我的高级Java课堂上有关线程的老师说了一些我不确定的东西。
他指出,以下代码不一定会更新ready
变量。据他介绍,这两个线程不一定共享静态变量,特别是在每个线程(主线程与ReaderThread
)在其自己的处理器上运行并且因此不共享相同的寄存器/缓存/等和一个CPU的情况下。不会更新其他。
从本质上讲,他说有可能ready
在主线程中进行更新,而不是在中进行更新ReaderThread
,因此ReaderThread
将无限循环。
他还声称该程序可以打印0
或打印42
。我了解如何42
打印,但不是0
。他提到将number
变量设置为默认值时就是这种情况。
我认为也许不能保证在线程之间更新静态变量,但是这对Java来说很奇怪。使ready
挥发物能纠正这个问题吗?
他显示了以下代码:
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;
}
}