我的高级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;
}
}
守候你守候我
沧海一幻觉
相关分类