AtomicReference 源碼學(xué)習(xí)

AtomicReference 源碼學(xué)習(xí)

前面寫了原子類的使用(傳送門),現(xiàn)在直接擼一下源碼吧

先看一下如何使用AR

            AtomicReference<String> ar = new AtomicReference<String>();
        ar.set("senninha");
        //CAS操作更新
        ar.compareAndSet("senninha", "senninha1");

AR類只有200多行源代碼,一下子就能擼完,先看一下成員變量吧:

    
    private static final long serialVersionUID = -1848883965231344442L;
    //unsafe類,提供cas操作的功能
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    //value變量的偏移地址,說(shuō)的就是下面那個(gè)value,這個(gè)偏移地址在static塊里初始化,見(jiàn)下面
    private static final long valueOffset;
    //實(shí)際傳入需要原子操作的那個(gè)類實(shí)例
    private volatile V value;

類裝載的時(shí)候初始化偏移地址:

 static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicReference.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

compareAndSet方法

/**
*也沒(méi)什么好說(shuō)的,就是調(diào)用Unsafe的cas操作,傳入對(duì)象,expect值,偏移地址,需要更新的值,即可,如果更新成功,返回true,如果失敗,返回false
public final boolean compareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

這里有個(gè)坑就是,對(duì)于String變量來(lái)說(shuō),必須是對(duì)象相同才視為相同,而不是字符串的內(nèi)容相同就可以相同,如下:

        AtomicReference<String> ar = new AtomicReference<String>();
        ar.set("senninha");
        System.out.println(ar.compareAndSet(new String("senninha"), "senninha1"));//false

weakCompareAndSet方法

   //沒(méi)看出和上面那個(gè)有啥區(qū)別
   public final boolean weakCompareAndSet(V expect, V update) {
        return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
    }

還有寫奇怪的自旋set的方法,沒(méi)找到UnaryOperator的實(shí)現(xiàn)類...反正就是自旋操作

  public final V getAndUpdate(UnaryOperator<V> updateFunction) {
        V prev, next;
        do {
            prev = get();
            next = updateFunction.apply(prev);
        } while (!compareAndSet(prev, next));
        return prev;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,901評(píng)論 11 349
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,918評(píng)論 0 11
  • 清晨,古鎮(zhèn),青天色,細(xì)雨蒙蒙塵塵 鎮(zhèn)口,兩座石獅像,其中一座座下兩道身影,一高一矮,細(xì)看,一磐如銅種,一站似青松....
    超級(jí)無(wú)敵大八幾閱讀 250評(píng)論 0 0
  • 我們走遍全世界,我們旅行的意義,不過(guò)是為了找到一條通往自己內(nèi)心的路。 誰(shuí)都想自由,可是誰(shuí)都沒(méi)有自由。
    夜墨0707閱讀 247評(píng)論 0 0

友情鏈接更多精彩內(nèi)容