atomatic包

大致看了下atomatic包下的類,都直到是用的CAS樂觀鎖,有的方法會重試直到成功,有的方法不管成功和失敗都會立刻返回。

AtomicInteger 類

comparaAnSet

JDK1.7和1.8一樣,調用unsafe的compareAndSwapInt,失敗返回false,不會重試

public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

getAndIncrement

JDK1.7和1.8有細微的差別。總體來說都會循環執行unsafe的compareAndSwapInt方法,直到成功爲止。

  • 1.8
public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

 //Unsafe 的方法
public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }
  • 1.7
public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }
 public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章