91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java的Volatile關鍵字的作用和實現原理

發布時間:2021-09-09 12:06:40 來源:億速云 閱讀:199 作者:chen 欄目:編程語言

本篇內容主要講解“Java的Volatile關鍵字的作用和實現原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java的Volatile關鍵字的作用和實現原理”吧!

volatile作用

volatile在并發編程中扮演著重要的角色,volatile是輕量級的synchronized,volatile關鍵字有兩個作用:

1)保證共享變量的可見性

可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。筆者此前一篇文章Java并發編程:Java內存模型JMM中有說到,Java內存模型中有主內存和本地內存之分,本地內存持有共享變量的一份副本,線程對共享變量的修改是先修改本地內存的副本,然后再回寫到主內存中去。

可能存在這樣的情況,線程A和線程B同時去修改一個共享變量C,假設線程A先對共享變量C做了修改,而此時線程B卻沒能及時感知到共享變量C已經發生了改變,緊接著B對本地過期的副本數據進行了修改,這造成了共享變量的不可見問題。

而使用了volatile關鍵字修改的共享變量,當線程修改了共享變量之后,會立馬刷新到主內存中,并且會使其他線程緩存了該地址的數據失效,這就保證了線程之間共享變量的可見性。

2)防止指令重排序

volatile關鍵字的另外一個作用就是防止指令重排序。代碼在實際執行過程中,并不全是按照編寫的順序進行執行的,在保證單線程執行結果不變的情況下,編譯器或者CPU可能會對指令進行重排序,以提高程序的執行效率。但是在多線程的情況下,指令重排序可能會造成一些問題,最常見的就是雙重校驗鎖單例模式:

public class SingletonSafe {     private static volatile SingletonSafe singleton;     private SingletonSafe() {   }     public static SingletonSafe getSingleton() {        if (singleton == null) {            synchronized (SingletonSafe.class) {                if (singleton == null) {                    singleton = new SingletonSafe();               }           }       }        return singleton;   } }

如果沒有使用volatile關鍵字,則可能會出現其他線程獲取了一個未初始化完成的singleton對象,具體原因筆者不在這里贅述了,有興趣的同學可以搜索一下“double  checked locking with delay initialization”學習下,筆者后續有時間再寫篇文章分析下。

volatile實現原理

1)可見性實現原理

對于volatile關鍵字修飾的變量,當對volatile變量進行寫操作的時候,JVM會向處理器發送一條lock前綴的指令,將這個緩存中的變量回寫到系統主存中。但是就算寫回到內存,如果其他處理器緩存的值還是舊的,再執行計算操作就會有問題,所以在多處理器下,為了保證各個處理器的緩存是一致的,就會實現緩存一致性協議。

緩存一致性協議:每個處理器通過嗅探在總線上傳播的數據來檢查自己緩存的值是不是過期了,當處理器發現自己緩存行對應的內存地址被修改,就會將當前處理器的緩存行設置成無效狀態,當處理器要對這個數據進行修改操作的時候,會強制重新從系統內存里把數據讀到處理器緩存里。

所以,如果一個變量被volatile所修飾的話,在每次數據變化之后,其值都會被強制刷入主存。而其他處理器的緩存由于遵守了緩存一致性協議,也會把這個變量的值從主存加載到自己的緩存中。這就保證了一個volatile在并發編程中,其值在多個緩存中是可見的。

2)防止指令重排序實現原理

volatile防止指令重排序是通過內存屏障來實現的。內存屏障分為如下三種:

Store Barrier

Store屏障,是x86的”sfence“指令,強制所有在store屏障指令之前的store指令,都在該store屏障指令執行之前被執行。

Load Barrier

Load屏障,是x86上的”ifence“指令,強制所有在load屏障指令之后的load指令,都在該load屏障指令執行之后被執行

Full Barrier

Full屏障,是x86上的”mfence“指令,復合了load和save屏障的功能。

Java內存模型中volatile變量在寫操作之后會插入一個store屏障,在讀操作之前會插入一個load屏障。一個類的final字段會在初始化后插入一個store屏障,來確保final字段在構造函數初始化完成并可被使用時可見。也正是JMM在volatile變量讀寫前后都插入了內存屏障指令,進而保證了指令的順序執行。

到此,相信大家對“Java的Volatile關鍵字的作用和實現原理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

钟山县| 广东省| 怀柔区| 林西县| 海口市| 蓬安县| 吴川市| 丹阳市| 黄大仙区| 秦安县| 钟祥市| 保康县| 克什克腾旗| 和静县| 郯城县| 南木林县| 若尔盖县| 庆云县| 芒康县| 井陉县| 醴陵市| 工布江达县| 长沙市| 万州区| 沙田区| 沿河| 台中市| 合肥市| 嘉荫县| 海门市| 盐山县| 娱乐| 静宁县| 资兴市| 荥阳市| 库伦旗| 庆阳市| 平原县| 扎兰屯市| 七台河市| 石林|