併發三 CAS/atomic

CAS

概念

compare and swap:比較和交換

作用

硬件級別支持的比較&交換的原子操作

//僞代碼 ,早期以下整段代碼是不具備原子操作的 是線程不安全的
 if(a == oldValue){
     a = newValue
 }  

這段代碼在以前是不具備原子操作的,硬件升級後,具備了原子能力

java應用

  • Unsafe類
     public static Unsafe getUnsafe() {
        Class var0 = Reflection.getCallerClass();
        //類加載限定不允許用戶自己調用
        if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
            throw new SecurityException("Unsafe");
        } else {
            return theUnsafe;
        }
    }

    //CAS原子操作類
    public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

    public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

底層的sun.misc.Unsafe類中實現了native方法,供java底層調用,而用戶無法調用,

java.util.concurrent.atomic原子包

原子包下的內容核心就是使用Unsafe類來實現的線程安全,以AtomicReference類爲例,其實大致都差不多

    /**只是確保了原子操作  
    *多線程情況下 如果值已經被其他線程改了就有可能交換不成功 
    *不成功就直接return false了
    */
    public final boolean compareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

    /**確保了原子操作  
    *多線程情況下 如果值已經被其他線程改了就有可能交換不成功 
    *不成功就反覆重試,如果競爭激勵 則可能多次自旋
    * @since 1.8
    */
    public final V getAndUpdate(UnaryOperator<V> updateFunction) {
        V prev, next;
        do {
            prev = get();
            next = updateFunction.apply(prev);
        } while (!compareAndSet(prev, next));
        return prev;
    }
發佈了38 篇原創文章 · 獲贊 4 · 訪問量 7522
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章