java Volatile與Synchronized
阿新 • • 發佈:2019-08-20
介紹Volatile變數之前,我們需要了解一下兩個概念:
如何保證執行緒中資料的一致性呢,首先我們可以利用synchronize同步操作,即多個執行緒在同一個時間內只能有一個執行緒訪問該資源變數,這樣保證了原子性的操作,同時,我們還有另外一種方法,即我們線上程操作的同時,可以將處理完的結果給到另外一個也是正在處理該資料的執行緒,保證資源的可見性,這時候就是利用的volatile。
Volatile變數:
本質在於告訴jvm當前變數在暫存器中的值是不確定的,需要從主存中去讀取。synchronize則是將該變數鎖住,不讓你能被其他執行緒訪問。
volatile只能使用在變數中,synchronize可是使用在方法和變數上。
Volatile變數具有synchronize的可見,但是不具有原子性。
因此只有在狀態真正獨立於程式內其他內容時才能使用 volatile —— 這條規則能夠避免將這些模式擴充套件到不安全的用例。
使用volatile需要具備以下兩個特徵:
-
對變數的寫操作不依賴於當前值。
-
該變數沒有包含在具有其他變數的不變式中。
-
volatile會禁止指令重排。