高併發場景下不僅可以使用volatile,並且推薦使用volatile。但是,你得知道volatile能夠使用在哪些地方。正確的使用volatile能提升很多效能。
volatile作為java中的關鍵詞之一,用於宣告變數的值可能隨時會別的執行緒修改,使用volatile修飾的變數會強制將修改的值立即寫入主存,主存中值的更新會使快取中的值失效(非volatile變數不具備這樣的特性,非volatile變數的值會被快取,執行緒A更新了這個值,執行緒B讀取這個變數的值時可能讀到的並不是是執行緒A更新後的值)。volatile會禁止指令重排序。
你要知道volatile的侷限性
volatile具有可見性、有序性,不具備原子性。
注意,volatile不具備原子性,這是volatile與java中的synchronized、java.util.concurrent.locks.Lock最大的功能差異,這一點在面試中也是非常容易問到的點。
volatile適用於對變數的寫操作不依賴於當前值,對變數的讀取操作不依賴於非volatile變數。適用於讀多寫少的場景。可用作狀態標誌。
JDK中volatie應用:JDK中ConcurrentHashMap的Entry的value和next被宣告為volatile,AtomicLong中的value被宣告為volatile。AtomicLong透過CAS原理(也可以理解為樂觀鎖)保證了原子性。
高併發場景下不僅可以使用volatile,並且推薦使用volatile。但是,你得知道volatile能夠使用在哪些地方。正確的使用volatile能提升很多效能。
volatile作為java中的關鍵詞之一,用於宣告變數的值可能隨時會別的執行緒修改,使用volatile修飾的變數會強制將修改的值立即寫入主存,主存中值的更新會使快取中的值失效(非volatile變數不具備這樣的特性,非volatile變數的值會被快取,執行緒A更新了這個值,執行緒B讀取這個變數的值時可能讀到的並不是是執行緒A更新後的值)。volatile會禁止指令重排序。
你要知道volatile的侷限性
volatile具有可見性、有序性,不具備原子性。
注意,volatile不具備原子性,這是volatile與java中的synchronized、java.util.concurrent.locks.Lock最大的功能差異,這一點在面試中也是非常容易問到的點。
volatile適用於對變數的寫操作不依賴於當前值,對變數的讀取操作不依賴於非volatile變數。適用於讀多寫少的場景。可用作狀態標誌。
JDK中volatie應用:JDK中ConcurrentHashMap的Entry的value和next被宣告為volatile,AtomicLong中的value被宣告為volatile。AtomicLong透過CAS原理(也可以理解為樂觀鎖)保證了原子性。