Java并發(fā)之不可思議的死循環(huán)詳解
更新時間:2017年01月17日 10:58:12 投稿:jingxian
下面小編就為大家?guī)硪黄狫ava并發(fā)之不可思議的死循環(huán)詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
下面的代碼將發(fā)生死循環(huán):
package com.zzj.concurrency; public class VolatileObjectTest implements Runnable{ private ObjectA objectA; // 加上volatile 就可以正常結束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 { // 如果啟動的時候加上-server 參數(shù)則會 輸出 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++; }
這是由于編譯器對其進行了優(yōu)化,因為while循環(huán)內(nèi)部沒有修改objectA變量且沒有用volatile修飾,JVM會把判斷提前,類似于優(yōu)化成如下:
if(objectA.isFlag()){ while(true){ i++; } }
以上這篇Java并發(fā)之不可思議的死循環(huán)詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解SpringBoot+Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換
這篇文章主要介紹了詳解SpringBoot+Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05eclipse/IDEA配置javafx項目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項目步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03SpringBoot報錯Invalid?bound?statement?(not?found)問題排查和解決方案
這篇文章主要介紹了SpringBoot報錯Invalid?bound?statement?(not?found)問題排查和解決方案,文中通過圖文結合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-03-03