volatile 關鍵字的如何保證記憶體可見性

2021-07-23 05:06:03 字數 1539 閱讀 5189

volatile關鍵字的作用

保證記憶體的可見性

防止指令重排

注意:volatile 並不保證原子性

記憶體可見性

volatile保證可見性的原理是在每次訪問變數時都會進行一次重新整理,因此每次訪問都是主記憶體中最新的版本。所以volatile關鍵字的作用之一就是保證變數修改的實時可見性。

當且僅當滿足以下所有條件時,才應該使用volatile變數

對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個執行緒更新變數的值。

該變數沒有包含在具有其他變數的不變式中。

volatile使用建議

兩個或者更多的執行緒需要訪問的成員變數上使用volatile。當要訪問的變數已在synchronized**塊中,或者為常量時,沒必要使用volatile

由於使用volatile遮蔽掉了jvm中必要的**優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。

volatile和synchronized區別

volatile不會進行加鎖操作:

volatile變數是一種稍弱的同步機制在訪問volatile變數時不會執行加鎖操作,因此也就不會使執行執行緒阻塞,因此volatile變數是一種比synchronized關鍵字更輕量級的同步機制。

volatile 變數作用類似於同步變數讀寫操作

從記憶體可見性的角度看,寫入volatile變數相當於退出同步**塊,而讀取volatile變數相當於進入同步**塊。

volatile 不如 synchronized安全:

在**中如果過度依賴volatile變數來控制狀態的可見性,通常會比使用鎖的**更脆弱,也更難以理解。僅當volatile變數能簡化**的實現以及對同步策略的驗證時,才應該使用它。一般來說,用同步機制會更安全些。

volatile 無法同時保證記憶體可見性和原則性:

加鎖機制(即同步機制)既可以確保可見性又可以確保原子性,而volatile變數只能確保可見性,原因是宣告為volatile的簡單變數如果當前值與該變數以前的值相關,那麼volatile關鍵字不起作用,也就是說如下的表示式都不是原子操作:「count++」、「count =count+1」。

如何理解volatile關鍵字

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

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

關鍵字volatile詳解

與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...