由單例模式學到 volatile關鍵字

2021-09-06 11:41:12 字數 787 閱讀 1611

msdn上說:

volatile 關鍵字指示乙個字段可以由多個同時執行的執行緒修改。 

宣告為 volatile 的字段不受編譯器優化的限制。

這樣可以確保該字段在任何時間呈現的都是最新的值。

volatile 關鍵字可應用於以下型別的字段:

可變關鍵字僅可應用於類或結構字段。 

不能將區域性變數宣告為 volatile。

volatile關鍵字僅應用於類或結構字段,用於通知編譯器,將有多個執行緒訪問該欄位,因此它不應當對此成員的狀態做任何優化,這樣可以確保該字段在任何時間呈現的都是最新的值。

不是所有的型別都可以被定義為volatile欄位,只有以下型別才可被定義為volatile:

注意觀察一下,就能發現只有值或引用的位數不超過本機整型值的位數(在32位系統中,為4個位元組)的型別才能成為volatile。為什麼會這樣呢?我的理解是:編譯器之所以保障volatile欄位在多執行緒情況下總是獲取到最新值,最重要的一點是volatile欄位操作的原子性,即編譯後的本地**只用一條機器指令就能對volatile欄位賦值了。如何保證操作的原子性呢?32位系統中,對任何資料操作都是以4位元組為基礎,自然一條機器指定就能搞定執行乙個小於4位元組的賦值操作。但如果字段占用記憶體大於4個位元組,那生成賦值語句的機器指令肯定大於一條,這樣在多執行緒的上下文切換中,有可能剛剛賦值到一半,就被切換到其他執行緒了。這樣,便無法保障volatile欄位在多執行緒環境下總是呈現乙個完整的、合法的最新值了。

總結:volatile關鍵字的目的就是在多執行緒訪問該字段時,保證任何時間呈現的都是最新的值!

volatile與單例模式

參考文獻 volatile關鍵字的作用 原理 保持記憶體可見性 所有執行緒都能看到共享資料的最新值。防止指令重排序。1 讀取前先從記憶體重新整理最新的值。2 寫入後立即同步回記憶體中。插入記憶體屏障來禁止重排序。例如 下面是基於保守策略的jmm記憶體屏障插入策略 在每個volatile寫操作的前面插...

由單例模式學到 靜態建構函式和靜態字段

編譯器在編譯的時候,會事先分析所需要的靜態字段,如果這些靜態字段所在的類有靜態的建構函式,則忽略靜態欄位的初始化,否則先進行靜態欄位的初始化。對類的靜態成員初始化的順序取決於在main函式中的引用順序,先引用到的先進行初始化,但如果類的靜態成員的初始化依賴於其它類的靜態成員,則會先初始化被依賴類的靜...

(一)設計模式之單例模式 volatile

簡單理解 在記憶體中某個例項物件只有乙個,並由程式程序中的其他執行緒共享該例項。1 了解物件建立過程 第一步 分配記憶體空間 第二步 呼叫建構函式,初始化例項。2 禁止指令重排序 當建構函式在物件初始化的完成之前就完成了物件賦值,在記憶體中開闢一片儲存區域後直接返回記憶體的引用,但是這個時候還沒正真...