今天咱們分析一下能保證原子性的Atomic系列,Atopic類是各類技術源碼中,包括咱們開發中,使用頻率比較高的一個模塊,因此咱們必定要好好掌握這個知識。Atomic系列有不少,可是咱們只須要分析清楚其中的一個,其實其他的就很容易理解了。今天挑的是AtomicInteger分析的源碼。java
咱們先理解一下AtomicInteger的原理:函數
咱們使用場景驅動的方式去分析。 public class AtomicDemo { public static void main(String[] args) { //步驟一:先分析一下構造函數 AtomicInteger atomicInteger = new AtomicInteger(0); //步驟二:讓值遞增,屬於核心方法 atomicInteger.incrementAndGet(); } } 步驟一:先分析一下構造函數 //構造函數很簡單,不過咱們須要注意的是 //value的類型是volatile類型的,也就是說value //這個值是具備可見性的 public AtomicInteger(int initialValue) { value = initialValue; } 步驟二:接下來分析最重要的一個方法。 public final int incrementAndGet() { //首先咱們要知道unsafe這個是 用c語言開發的 //這個對象咱們用戶是使用不了的,只能jdk底層使用 //以下這句話的語義是:this表明的是AtomicInteger這個對象,valueOffset表明的是 //value這個屬性在AtoimcInteger類中的哪一個位置 return unsafe.getAndAddInt(this, valueOffset, 1) + 1; } public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { //獲取到當前value的值 var5 = this.getIntVolatile(var1, var2); //注意這兒作的是一個cas的操做 //compareAndSwapInt(this,valueOffset,value,value+1) //這個方法的語義就是,先靠 this對象(var1)和valueOffset(var2)兩個參數 //獲取到value的位置,而後再用剛剛獲取到的value(var5)對比 //比較此時此刻的是仍是以前var5這個值嗎?若是是那麼就 執行 value + 1(var4) //操做。這樣就cas操做成功,cas成功就返回ture,退出 //若是不成功就返回false,繼續循環。一直到成功爲止。 } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
Atomic類的源碼是比較簡單的,分析Atomic類的時候,咱們要重點掌握CAS這個知識。this
搞定,手工!atom