Java并發(fā)之不可思議的死循環(huán)詳解
下面的代碼將發(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)部沒有修改objectA變量且沒有用volatile修飾,JVM會(huì)把判斷提前,類似于優(yōu)化成如下:
if(objectA.isFlag()){ while(true){ i++; } }
以上這篇Java并發(fā)之不可思議的死循環(huán)詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換
這篇文章主要介紹了詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03SpringBoot報(bào)錯(cuò)Invalid?bound?statement?(not?found)問題排查和解決方案
這篇文章主要介紹了SpringBoot報(bào)錯(cuò)Invalid?bound?statement?(not?found)問題排查和解決方案,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03Java之獲取客戶端真實(shí)IP地址的實(shí)現(xiàn)
在開發(fā)工作中,我們常常需要獲取客戶端的IP,本文主要介紹了Jav之獲取客戶端真實(shí)IP地址的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12