论坛首页 Java企业应用论坛

一个多线程问题

浏览 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值可能永远不可见导致程序会一直保持循环?

   发表时间:2008-10-12  
原因很简单,读线程缓存了ready的值,没有再从主存中去读。除非你将ready声明为volatile
0 请登录后投票
   发表时间:2008-10-12  
刚好看到volatile....感谢兄台指点...
0 请登录后投票
   发表时间:2008-10-13  
我这边的机器,JDK5.0的运行起来时是直接输出24。
0 请登录后投票
   发表时间:2008-10-13  
很正常,ready已经是线程本地变量了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics