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并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。