volatile關鍵字理解

2022-02-25 07:12:43 字數 1086 閱讀 9507

public class test 

}}, "read").start();

new thread(() ->

}, "update").start();}}

執行結果:執行緒update會一直執行,執行緒read不會執行,執**況一直如此。

原因分析:執行緒read,無法感知init_value的變化,因為執行緒read中讀到的init_value值一直都是快取中的值,沒有讀到主記憶體的值,所以init_value的值永遠是0.

快取的效率是比主存的速度快的,加入快取的目的是為了提高訪問速度,但是加入快取後也出現了資料一致性的問題,尤其是在多執行緒的環境下。

程式處理a++的具體流程:

1、讀取主存中的 a 到cpu cache中。

2、對a進行加1操作。

3、將結果寫入到cpu cache中。

4、將資料重新整理到主存中。

在加上valotile之後在read執行緒中就能看到init_value的變化。

private volatile static int init_value = 0;

可見volatile的作用之一就是保證變數的可見性,它能讓資料直接同步到主存中去,讓快取中的資料失效。

int x = 0;

int y = 1;

volatile int z = 20;

x++;

y--;

volatile int z = 20;之前,x和y的執行順序並不關心,只要能保證到執行z = 20時,x=0 y=1就行了。

至於後面的x++ y--哪條指令先執行也不用關心。

private volatile boolean initialized = false;

private context context;

public context load()

return context;

}

initialized被volatile修飾,這就意味著,當initialized=true時,loadcontext()方法是一定執行完成的。

Volatile關鍵字理解

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

理解volatile關鍵字

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

如何理解volatile關鍵字

暫時由於查了好多網路上的資料都沒有具體的說明,有範圍也很大沒有看懂,後面如果理解有錯再修改。1.全域性共享變數非volatile 我是這樣理解的,對於多執行緒中,多個執行緒啟動時,部分先啟動的執行緒會把全域性變數拷貝乙個副本到自己的執行緒棧,有的則是啟動 還沒有read load變數到自己的本地棧空...