JAVA并发编程实战里的一个例子
在看到这本书的第三张的第一个程序例子的时候产生了一些疑问,希望大牛能够帮忙解惑,小弟不胜感激。例子如下:
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;
}
}
疑惑
作者在后面写到“NoVisiabilty可能会持续循环下去,因为读线程可能永远都看不到ready的值” 为什么呢?在我的理解当中肯定是会停止的呀,有没有可能是书中写错了呢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我看书里好像是这样, 你这里貌似加了个大括号在while这块(不过不影响), 我大概理解了你的困惑:
你要往后面看看,看到Java内存模型就差不多能理解了 书里写的没问题
简单来讲就是主线程修改了
ready
,ReaderThread
不知道。还以为是false线程有自己的工作内存空间, 其他线程改了 ready, 你自己线程空间可能没改.
在JDK1.8的环境下试了一下,手动控制线程执行顺序,没有发现无限循环的现象。 推荐你看下这个文章,应该有一些帮助:https://blog.csdn.net/joenqc/article/details/54925700
内存可见性问题,去看看
JMM
两个方面吧
一个是内存可见性,子线程看到的ready值和主线程的可能不一致。
另一个是每次
Thread.yield()
之后,还是子线程抢到了执行权。