java.util.concurrent.atomic隨筆及volatile語義

 

一個原子操做(atomic operation)是個不能分割的總體,沒有其它線程(thread)可以中斷或檢查正在原子操做中的變量。一個原子(atomic)類型就是一個原子操做可用的類型,它能夠在基本上沒有鎖(lock)的狀況下作到線程安全(thread-safe)。java

java.util.concurrent.atomic包就是提供原子操做的類的小工具包,支持在單個變量上解除鎖定的線程安全編程。包中的類將volatile值、字段和數組元素的概念擴展到那寫也支持原子條件更新操做的類。如AtomicReference,一個「能夠用原子方式更新的對象引用」。編程

JDK的文檔中說:「設計原子類主要用做各類塊,用於實現非阻塞數據結構和相關基礎結構類compareAndSet()方法不是鎖定的常規替換方法。僅當對象的重要更新限於單個變量時才應用它」數組

類圖解:緩存

java.util.concurrent.atomic隨筆及volatile語義 - javaee_chen - javaee_chen的博客

?從類圖中能夠清晰的得出:這些基本都是實現java經常使用的基本類型及他們的數組的原子實現。


volatile語義安全

volatile至關於synchronized的弱實現,也就是說volatile實現了相似synchronized的語義,卻又沒有鎖機制。它確保對volatile字段的更新以可預見的方式告知其餘的線程。數據結構

volatile包含如下語義:app

(1)Java 存儲模型不會對valatile指令的操做進行重排序:這個保證對volatile變量的操做時按照指令的出現順序執行的。工具

(2)volatile變量不會被緩存在寄存器中(只有擁有線程可見)或者其餘對CPU不可見的地方,每次老是從主存中讀取volatile變量的結果。也就是說對於volatile變量的修改,其它線程老是可見的,而且不是使用本身線程棧內部的變量。也就是在happens-before法則中,對一個valatile變量的寫操做後,其後的任何讀操做理解可見此寫操做的結果。atom

儘管volatile變量的特性不錯,可是volatile並不能保證線程安全的,也就是說volatile字段的操做不是原子性的,volatile變量只能保證可見性(一個線程修改後其它線程可以理解看到此變化後的結果),要想保證原子性,目前爲止只能加鎖!spa

應用volatile變量的三個原則:

(1)寫入變量不依賴此變量的值,或者只有一個線程修改此變量

(2)變量的狀態不須要與其它變量共同參與不變約束

(3)訪問變量不須要加鎖

相關文章
相關標籤/搜索