如何理解volatile關鍵字

2021-08-15 11:14:12 字數 686 閱讀 1996

暫時由於查了好多網路上的資料都沒有具體的說明,有範圍也很大沒有看懂,後面如果理解有錯再修改。

1.全域性共享變數非volatile:

我是這樣理解的,對於多執行緒中,多個執行緒啟動時,部分先啟動的執行緒會把全域性變數拷貝乙個副本到自己的執行緒棧,有的則是啟動

還沒有read load變數到自己的本地棧空間,後續先載入了變數的執行緒都在自己的棧空間操作變數然後再重新整理到主存,如果這個操作不是原子性,比方++a或者a--,這部分執行緒就會出現共享問題並非執行緒安全,得到的結果並不是我們預先想要的。對於沒有載入的變數的其它執行緒同樣也會出現後續載入到本地記憶體的變數不是最新版本的,是乙個失效資料(舊資料)。

1.全域性共享變數volatile:

這個和非volatile變數區別於其它執行緒對共享變數的操作修改都是可見的,也就是說如果變數已經在其它執行緒中發生了修改,但是這個時候的最新值並沒有同步

重新整理到主存,即使這樣後面再次載入變數的其他執行緒也會拿到最新的乙個變數值,而不是當前執行緒中快取的值。但是volatile的變數並不能保證複合型操作的原子性

所以還是會出現共享變數的安全問題,也很大可能得不到我們理想的結果。所以如果對於這種情況還是得加鎖來保證其執行緒安全,所以才說volatile是弱的執行緒安全。執行緒安全的兩個方面:1.執行控制 2.記憶體可見 中只能保證了記憶體可見,不能保證執行控制(控制**執行(順序)及是否可以併發執行),synchronized關鍵字就可以達到兩個要求。

Volatile關鍵字理解

物理角度 由於計算機的儲存裝置和cpu的運算速度有幾個數量級的差距,所以現代計算機系統加入一層速度接近 cpu的快取記憶體 cache 但cache帶來乙個問題 快取一致性問題 在多處理器系統中,每個處理器機油自己的cache 工作記憶體 又共享同一主記憶體。舉例 當程式在執行過程中,會將運算需要的...

理解volatile關鍵字

1.可見性 2.禁止指令重排序class factory public static factory getinstance return factory 2.1 dcl疑問解釋 synchronized 快中的非空判斷 這裡做判斷是防止在初始化factory的時候,有兩個執行緒進入,其中乙個執行緒...

volatile關鍵字理解

public class test read start new thread update start 執行結果 執行緒update會一直執行,執行緒read不會執行,執 況一直如此。原因分析 執行緒read,無法感知init value的變化,因為執行緒read中讀到的init value值一直...