我应该采用什么样的修改来永久地进行这种循环?

时间:2013-08-27 18:24:27

标签: java multithreading concurrency thread-safety

我想在不使用任何同步的情况下从多个线程访问变量时向我自己展示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线程)。

1 个答案:

答案 0 :(得分: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;
}

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

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