我正在阅读这本书:“Java Concurrency in Practice”,以更好地理解java并发的工作原理。在第3章第3.1节:可见性本书试图展示可见性问题是如何发生的。这是示例代码(书中的清单3.1):
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 :(得分:6)
因为ready没有标记为volatile,并且值可以在while循环的开头缓存,因为它在while循环中没有更改。这是抖动优化代码的方式之一。
因此,线程可能在ready = true之前启动,并且读取ready = false缓存线程本地并且永远不再读取它。
查看volatile关键字。