1

visibility在不使用任何同步方式从多个线程访问变量时,我想向自己展示线程安全问题。

我正在从Java Concurrency in Practice运行这个示例:

public class NoVisibility {

    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {

        @Override
        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}

如何让它永远循环而不是42每次运行时都打印(永远循环意味着线程中变量的修改对ready = true;线程ReaderThread不可见main)。

4

1 回答 1

1
public static void main(String[] args) throws InterruptedException {
    new ReaderThread().start();
    number = 42;
    //put this over here and program will exit
    Thread.sleep(20000);
    ready = true;
}

调用 20 秒会发生什么,JIT将Thread.sleep()在这 20 秒内启动,它将优化检查并缓存值或完全删除条件。因此代码将在可见性上失败。

要阻止这种情况发生,您必须使用volatile.

于 2013-08-27T21:28:07.477 回答