亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的Volatile用法是什么

發布時間:2021-10-27 16:28:01 來源:億速云 閱讀:164 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關Java的Volatile用法是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

在原子性、可見性、有序性中,volatile關鍵字主要在可見性中發揮作用。

volatile聲明的變量對所有線程來說是可見的,就是說當變量的值發生改變的時候,其他線程可以立馬發現這個變化。

public class Main {  private static boolean isRuning;  private static int number;  private static class ReaderThread extends Thread {    public void run() {      while (!isRuning) {        System.out.println(number);      }    }  }  public static void main(String[] args) throws InterruptedException {    new ReaderThread().start();    Thread.sleep(1000);    number = 42;    isRuning = true;    Thread.sleep(1000);  }}

應該是由于編譯器優化的存在,這里變量雖然沒有被volatile修飾,但是仍然對其他線程可見。。。。。

那為啥Volatile修飾的變量i++卻會有并發問題呢?

因為i++并不是原子操作,

i++是有兩步操作的,比如 i=0; i++

1.讀取i=0

2.計算i+1,然后賦值給i

那么可能存在2個線程同時讀取到i=0,并計算出結果i=1然后賦值給I

那么就得不到預期結果i=2。

就是說雖然Volatile修飾的變量的變化可以被其他線程看到,但是如果同時去讀這個變量,然后進行寫操作,則仍會導致線程安全問題。

更底層的原因是什么呢?

首先要知道Volatile修飾的變量會做兩件事(由lock指令完成):

1)將當前處理器緩存行的數據寫回到系統內存。  2)寫回內存的操作會使在其他 CPU 里緩存了該內存地址的額數據無效。

其他緩存會失效,不正好可以保證Volatile的原子性嗎?

然而并不是,

比如有T1 T2兩個線程進行i++操作。

當T1將變量加載到緩存,但是還沒進行i++運算,T2呢已經加載完緩存并且已經執行完運算,那這個時候T1緩存里的值就該變成無效的了。

但是Volatile并不是讓其他線程緩存無效以后就去重新加載主內存中的值,如果這時候T2緩存的值已經被放到寄存器并且cpu進行計算了,那即使緩存無效也不會影響T2將計算的值回寫到主內存中。

關于cpu執行指令的過程可以參考https://blog.csdn.net/jizhu4873/article/details/84393905

當一個變量定義為 volatile 之后,將具備兩種特性:

1.保證此變量對所有的線程的可見性,這里的“可見性”,如本文開頭所述,當一個線程修改了這個變量的值,volatile 保證了新值能立即同步到主內存,以及每次使用前立即從主內存刷新。但普通變量做不到這點,普通變量的值在線程間傳遞均需要通過主內存(詳見:Java內存模型)來完成。

2.禁止指令重排序優化。有volatile修飾的變量,賦值后多執行了一個“load addl $0x0, (%esp)”操作,這個操作相當于一個內存屏障(指令重排序時不能把后面的指令重排序到內存屏障之前的位置),只有一個CPU訪問內存時,并不需要內存屏障;(什么是指令重排序:是指CPU采用了允許將多條指令不按程序規定的順序分開發送給各相應電路單元處理)。

volatile 變量的內存可見性是基于內存屏障(Memory Barrier)實現。

內存屏障則由lock指令實現

看完上述內容,你們對Java的Volatile用法是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芜湖市| 南阳市| 全州县| 香格里拉县| 鹤峰县| 青岛市| 乐业县| 邵东县| 龙井市| 衡东县| 浦北县| 库尔勒市| 新沂市| 巫山县| 伽师县| 始兴县| 惠水县| 改则县| 沐川县| 夹江县| 四川省| 滨海县| 庄河市| 车致| 两当县| 江油市| 建水县| 大渡口区| 孟州市| 山阴县| 武胜县| 定南县| 科尔| 大方县| 喀喇沁旗| 略阳县| 信丰县| 拜城县| 阳新县| 台南市| 沅江市|