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

Hos*_*ein 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该书说NoVisibility可以永远循环,因为ready的值可能永远不会对读者线程可见.怎么可能.我的一般理解是,无论如何,准备将在某个时间成为现实.但我无法理解为什么这可能不会发生并且循环永远存在.有人可以帮助我更好地理解这一点.

Bur*_*ard 6

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

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

查看volatile关键字.

资源