我正在查看 Brian Goetz 的“Java Concurrency in Practice”中的代码示例。他说这段代码可能会停留在无限循环中,因为“'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;
}
}
最佳答案
因为 ready
没有被标记为 volatile
并且该值可能会在 while
循环的开头被缓存,因为它不是在 while
循环中更改。这是抖动优化代码的方式之一。
因此,线程可能在 ready = true
之前启动并读取 ready = false
在本地缓存该线程并且不再读取它。
查看 the volatile keyword .
关于java - 关于 "Java Concurrency in Practice"示例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1919469/