关于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;
	}

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

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

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务