下面的代碼將發(fā)生死循環(huán):
package com.zzj.concurrency;public class VolatileObjectTest implements Runnable{ private ObjectA objectA; // 加上volatile 就可以正常結(jié)束While循環(huán)了 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 { // 如果啟動(dòng)的時(shí)候加上-server 參數(shù)則會(huì) 輸出 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; } } }死循環(huán)發(fā)生在代碼段:
while (objectA.isFlag()) { i++;}這是由于編譯器對(duì)其進(jìn)行了優(yōu)化,因?yàn)閣hile循環(huán)內(nèi)部沒(méi)有修改objectA變量且沒(méi)有用volatile修飾,JVM會(huì)把判斷提前,類(lèi)似于優(yōu)化成如下:
if(objectA.isFlag()){ while(true){ i++; }}以上這篇Java并發(fā)之不可思議的死循環(huán)詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注