关于while(true)的执行效率问题

public class TestVolatile {	
	public static void main(String[] args) {
		ThreadDemo td = new ThreadDemo();
		new Thread(td).start();
		while(true){
                       // 注释后,程序死循环。去掉注释,程序正常结束。据说因为while(true)执行速度太快的原因。求解释 //System.out.println("!!"); 
			if(td.isFlag()){
				System.out.println("------------------");
				break;
			}
		}		
	}
}
class ThreadDemo implements Runnable {

	private  boolean flag = false;

	@Override
	public void run() {
		
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
		}

		flag = true;
		
		System.out.println("flag=" + isFlag());

	}

	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

}
下图为注释的运行结果,显示一直没有结束。这个可以理解。但是为什么加了一句打印,程序就可以结束呢?

全部评论
private volatile boolean flag = false; 给flag加上volatile关键字就不会死循环了。 我猜应该是因为没有额外的语句,所以线程1修改后的flag的值一直在CPU缓存中,没有更新到内存,然后主线程也没有从内存里读值。 或者是编译器自动优化?这个不太懂,感觉应该是内存中的flag值没有更新,看内存和CPU缓存这些也不会调试啊,求大神解答。
点赞 回复 分享
发布于 2017-02-12 12:24
我没有复现出你所说的情况,无论注释与否程序都没有出现死循环。
点赞 回复 分享
发布于 2017-02-12 11:16

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务