Java并发中如何出现可见性问题?

时间:2013-03-10 13:04:17

标签: java concurrency concurrent-programming

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

1 个答案:

答案 0 :(得分:6)

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

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

查看volatile关键字。

Source