volatile原理和使用場景

volatile 關鍵字只能用於修飾變量,沒法用於修飾方法。而且 volatile 只能保證可見性,但不能保證操做的原子性。編程

在具體編程中體現爲:volatile 只能保證基本類型以及通常對象的引用賦值是線程安全的。安全

volatile工做原理

爲何 volatile 只能保證可見性,不能保證原子性呢?這跟它的工做原理有關。多線程

  • 線程寫 volaitle 變量的步驟爲:線程

    • 改變線程工做內存中 volatile 變量副本的值
    • 將改變後的副本的值從工做內存刷新到主內存
  • 線程讀 volatile 變量的步驟爲:對象

    • 從主內存讀取 volatile 變量的最新值到線程的工做內存中
    • 從工做內存中讀取 volatile 變量的副本

因爲在整個過程沒有涉及到鎖相關的操做,因此沒法保證原子性,可是因爲實時刷新了主內存中的變量值,所以任什麼時候刻,不一樣線程總能看到該變量的最新值,保證了可見性。內存

volatile使用場景

要在多線程中安全的使用 volatile 變量,必須同時知足:it

  • 對變量的設置操做不依賴其當前值變量

    • 不知足舉例:number++、count = count + 5
    • 知足舉例: boolean 變量等
  • 該變量沒有包含在具備其餘變量的不等式中原理

    • 不知足舉例:不變時 low < up

    在實際項目中,因爲不少狀況下都不滿意 volatile 的使用條件,因此 volatile 使用的場景並無 synchronized 廣。引用

相關文章
相關標籤/搜索