java多執行緒與併發 - volatile的作用及原理

b9x_發表於2018-02-08

一.volatile的作用

  1. 當一個變數加上 volatile關鍵字 之後,就具備了可見性,但不能具備原子性
  2. 可以防止指令重排序,在一定程度上保證指令有序性。也就是指令重排序時不能把後面的指令重排序到記憶體屏障之前的位置,而對volatile關鍵字修飾的變數的操作就相當與一個記憶體屏障。

二.volatile的使用

  • 使用volatile時必須具備以下2個條件:

    1. 對變數的寫操作不依賴於當前值
    2.該變數沒有包含在具有其他變數的不變式中
    
  • 反正進行非原子操作的變數不適合用volatile

  • 根據volatile的作用和使用條件,大概可以知道一些volatile的使用場景了,比如可以用在做狀態標誌變數上。
    volatile boolean flag;

三.實現原理

  • volatile的實現是用了Lock指令。
  • Lock指令的作用:
    1.將當前處理器快取行(緩衝的最小單位)內容寫回到系統記憶體
    2.中寫回到記憶體的操作會使其他CPU裡緩衝了該記憶體地址的資料失效(就不在緩衝中了)
  • 也就是當宣告變數是 volatile 的,在工作記憶體中處理完該資料會立即重新整理到主存,並使其他執行緒工作記憶體或緩衝中的該變數失效,就會重新到記憶體讀取該資料。也就保證了可見性。還是要說volatile不能像sychronized保證原子性,因為jvm只在最後寫回這最後一步讓所有執行緒可見,但中間的幾步是不安全的。

相關文章