jdk源碼之AtomicInteger源碼註釋

        今天咱們分析一下能保證原子性的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

相關文章
相關標籤/搜索