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;
}
}
在《java concurrency in practice》3章1节 中描述说上面的代码有可能 不会有输出,或者,有可能输出为0,又或者按照我们一般期待的那样输出,但是我在自己机器上实践这些代码时,怎么都无法出现书中所描述的问题。一直很正常。
我如何才能产生书中所描述的 现象
这个java内存模型 有没办法来测试呢?有了这个内存模型,这个程序就有解了。
不好意思,这个证明及测试已经超出我的能力范围了。给你个专门的 JMM 页面吧。
http://www.cs.umd.edu/~pugh/java/memoryModel/
他让CPU执行new ReaderThread().start();下面的语句:
number = 42;
ready = true;
如果你改为
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
//Thread.yield();
System.out.println(number);
}
} public static void main(String[] args) throws Exception{
new ReaderThread().start();
Thread.sleep(1);//
number = 42;
ready = true;
}如果你sleep一毫秒 并且没有yield。那么线程就会输出一个零
如果加上yield那么就会执行sleep(),number=42,ready=true
然后输出number:42