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

相关推荐

02-11 12:20
门头沟学院 Java
面试中的青提很胆小:我不信有比我们学校更逆天的,计算机专业就业第一位是我们学校二餐厅的打印店
点赞 评论 收藏
分享
2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务