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并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
热门推荐
10 八一幼儿祝福语大全简短
11 公司乔迁食堂祝福语简短
12 婚礼结束聚餐祝福语简短
13 儿媳买车妈妈祝福语简短
14 毕业送礼老师祝福语简短
15 同事辞职正常祝福语简短
16 恭贺新婚文案祝福语简短
17 金店立秋祝福语简短英文
18 婆婆高寿祝福语大全简短