案例描述
在《Java Concurrecy In Practice》书中第三章清单3.1有可见性
导致的BUG示例:
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready) {
}
System.out.println(number);
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
Thread.sleep(100);
number = 42;
ready = true;
System.out.println("ready = "+ready);
}
}
我用这个例子测试了很多遍,并没有出现书中描述所说的,可以能会输出0,可能会死循环。
测试失败
填坑之路
后来查阅资料,
知乎上的大佬
一个java 多线程 的可见性问题? - Viscent大千的回答 - 知乎
https://www.zhihu.com/question/23614549/answer/79762182
加上-server
虚拟机参数
再次测试:
测试成功
网友评论