浏览 2019 次
锁定老帖子 主题:一个多线程问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-11
public class NoVisibility { private static boolean ready; private static int num; private static class ReaderThread extends Thread { public void run() { while (!ready) { Thread.yield(); } System.out.println(num); } } /** * @param args */ public static void main(String[] args) { new ReaderThread().start(); num = 24; ready = true; } } 最后的结果可能是:NoVisibility可能会一直保持循环, 因为对于读线程来说, ready的值可能永远不可见. 甚至更奇怪的现象是, NoVisibility可能会打印0, 因为经过优化,可能机器底层会先执行ready=true 上面第二个结果好理解, 第一个我就不明白.为什么ready值可能永远不可见导致程序会一直保持循环? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-12
原因很简单,读线程缓存了ready的值,没有再从主存中去读。除非你将ready声明为volatile
|
|
返回顶楼 | |
发表时间:2008-10-12
刚好看到volatile....感谢兄台指点...
|
|
返回顶楼 | |
发表时间:2008-10-13
我这边的机器,JDK5.0的运行起来时是直接输出24。
|
|
返回顶楼 | |
发表时间:2008-10-13
很正常,ready已经是线程本地变量了
|
|
返回顶楼 | |