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