1

我正在阅读这本书:“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 的值可能永远不会对读者线程可见。这怎么可能。我的一般理解是,无论如何,准备好会在某个时间成为现实。但我不明白为什么这可能不会发生并且循环永远存在。有人可以帮助我更好地理解这一点。

4

1 回答 1

6

因为 ready 没有被标记为 volatile 并且值可能在 while 循环开始时被缓存,因为它在 while 循环中没有改变。这是抖动优化代码的方式之一。

因此,线程可能在 ready = true 之前启动并读取 ready = false 在本地缓存该线程并且不再读取它。

查看 volatile 关键字。

来源

于 2013-03-10T13:07:41.260 回答