Java并发之不可思议的死循环详解
程序员文章站
2024-03-08 20:35:28
下面的代码将发生死循环:
package com.zzj.concurrency;
public class volatileobjecttest impl...
下面的代码将发生死循环:
package com.zzj.concurrency; public class volatileobjecttest implements runnable{ private objecta objecta; // 加上volatile 就可以正常结束while循环了 public volatileobjecttest(objecta a) { this.objecta = a; } public objecta geta() { return objecta; } public void seta(objecta a) { this.objecta = a; } @override public void run() { long i = 0; while (objecta.isflag()) { i++; } system.out.println("stop my thread " + i); } public void stop() { objecta.setflag(false); } public static void main(string[] args) throws interruptedexception { // 如果启动的时候加上-server 参数则会 输出 java hotspot(tm) server vm system.out.println(system.getproperty("java.vm.name")); volatileobjecttest test = new volatileobjecttest(new objecta()); new thread(test).start(); thread.sleep(1000); test.stop(); system.out.println("main thread " + test.geta().isflag()); } static class objecta { private boolean flag = true; public boolean isflag() { return flag; } public void setflag(boolean flag) { this.flag = flag; } } }
死循环发生在代码段:
while (objecta.isflag()) { i++; }
这是由于编译器对其进行了优化,因为while循环内部没有修改objecta变量且没有用volatile修饰,jvm会把判断提前,类似于优化成如下:
if(objecta.isflag()){ while(true){ i++; } }
以上这篇java并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。