Java并发之不可思议的死循环详解
下面的代码将发生死循环:
packagecom.zzj.concurrency; publicclassVolatileObjectTestimplementsRunnable{ privateObjectAobjectA;//加上volatile就可以正常结束While循环了 publicVolatileObjectTest(ObjectAa){ this.objectA=a; } publicObjectAgetA(){ returnobjectA; } publicvoidsetA(ObjectAa){ this.objectA=a; } @Override publicvoidrun(){ longi=0; while(objectA.isFlag()){ i++; } System.out.println("stopMyThread"+i); } publicvoidstop(){ objectA.setFlag(false); } publicstaticvoidmain(String[]args)throwsInterruptedException{ //如果启动的时候加上-server参数则会输出JavaHotSpot(TM)ServerVM System.out.println(System.getProperty("java.vm.name")); VolatileObjectTesttest=newVolatileObjectTest(newObjectA()); newThread(test).start(); Thread.sleep(1000); test.stop(); System.out.println("MainThread"+test.getA().isFlag()); } staticclassObjectA{ privatebooleanflag=true; publicbooleanisFlag(){ returnflag; } publicvoidsetFlag(booleanflag){ this.flag=flag; } } }
死循环发生在代码段:
while(objectA.isFlag()){ i++; }
这是由于编译器对其进行了优化,因为while循环内部没有修改objectA变量且没有用volatile修饰,JVM会把判断提前,类似于优化成如下:
if(objectA.isFlag()){ while(true){ i++; } }
以上这篇Java并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。