我目前正在阅读 Java Concurrency in Practice ,而且有一些我无法理解的东西。
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;
}
}
和作者说
NoVisibility可能永远循环,因为ready的值可能永远不会变为 读者线程可见。
没有任何解释或者可能在某个地方,但是现在我真的很困惑。我真的很感激任何解释。
答案 0 :(得分:1)
这意味着
while (!ready)
Thread.yield();
将永远运行,因为, 在main方法中将ready设置为true将不会反映在线程中。
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
相反,您可以使用术语 volatile ,它会更新变量发生变化时的值。