java 内存可见性问题

GUOXIAOHU1 2016-11-29 04:17:35
在《Java并发编程实战》有一个关于内存可见性的例子
public class NoVisibility {
private static boolean ready;
private static int number;

private static class ReadThread extends Thread {
public void run() {
while (!ready) {
Thread.yield();
}
System.out.println(number);
}
}

public static void main(String[] args) throws InterruptedException {
new ReadThread().start();
number = 42;
ready = true;
System.out.println("set ready:" + ready);
}
}

按照书上所说,由于没有同步,程序可能一直运行下去,甚至输出0,但是我在实际运行过程中始终没有出现这两种现象,另外,我将Thread.yield();注释掉后,程序会一直运行下去,请问大家知道
1、为什么始终没有出现那两种现象?
2、为什么注释掉以后会一直运行下去?
...全文
146 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户昵称13579 2016-11-29
  • 打赏
  • 举报
回复
Thread.yield()并没有一个明确的规范,或者说在实际实现中完全是可以什么都没有做的空方法,这也就为什么很多书籍推荐用Thread.sleep(1)来代替这个方法的原因。 在编程的时候,应该按最坏的情况来想,不是说你自己运行发现没有出现"程序一直运行下去的情况"就没有问题。不管从理论还是经验上来判断,这段代码明显[b]有可能[/b]有可见性的问题。但Thread.yield()在这里起到了捣乱的作用,可能在你的JVM上导致了不出现问题的情况。但这段代码你在的JVM上跑出这样的结果,不意味着在其他JVM上就不会一直运行下去不会结束。 要解决的话,最简单的就是声明ready为volatile来提供线程共享性。
逗泥丸的平方 2016-11-29
  • 打赏
  • 举报
回复
不知道 没试出来 是不是你程序抄错了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧