价值可见度

时间:2015-11-29 17:03:39

标签: java concurrency java-memory-model

我目前正在阅读 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的值可能永远不会变为   读者线程可见。

没有任何解释或者可能在某个地方,但是现在我真的很困惑。我真的很感激任何解释。

1 个答案:

答案 0 :(得分:1)

这意味着

while (!ready)
    Thread.yield();

将永远运行,因为, 在main方法中将ready设置为true将不会反映在线程中。

public static void main(String[] args) {
    new ReaderThread().start();
    number = 42;
    ready = true;
}

相反,您可以使用术语 volatile ,它会更新变量发生变化时的值。