在Java 8中是否存在并发中发生的活动失败
我将尝试重现以下有效
Java(第二版)中提到的代码.
属于第10章并发项66. public class StopThread { private static boolean stopRequested; public static void main(String args[]) { Thread backgroudThread = new Thread(new Runnable(){ public void run() { int i = 0; while(!stopRequested) { i ++; } } }); backgroudThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } 根据作者的描述,当您运行上面的过程段时,backgroupdThread将不会终止.但是我无法在设置Java8环境的机器中重现它.那么这个问题是否已在Java最新版本中进行了优化? 更新 PS:在linux操作系统(redhat).如果按上述代码运行,程序将不会终止.但是如果我在“while”循环中的“i”之后添加“System.out.println(i)”.此时.程序将始终终止.这是我的新发现.如果您知道原因,请发布您的答案.我将继续深入研究这些系列问题,直到找到真正的原因. 解决方法
那么,如果更准确,作者写道:
现在你仍然可以争辩这个原因他显然没有“永远”运行这个程序,但你明白了. 顺便说一句,在我的机器上,程序永远不会终止(JDK 1.7.0_45) 更新: while(!stopRequested) { i ++; } 变为: if (!stopRequested) while(true) { i ++; } JVM热点执行这种优化(称为提升).如果你想深入研究为什么它是一个合法的优化,你应该做一些阅读:JLS §17.4.3 Programs and Program Order (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |