使用CAS(AtomicReference)實(shí)現(xiàn)的單例模式

CAS是項(xiàng)樂(lè)觀鎖技術(shù),當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí),只有其中一個(gè)線程能更新變量的值,而其它線程都失敗,失敗的線程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試。

樂(lè)觀鎖的一種實(shí)現(xiàn)方式——CAS

在JDK1.5 中新增java.util.concurrent(J.U.C)就是建立在CAS之上的。相對(duì)于對(duì)于synchronized這種阻塞算法,CAS是非阻塞算法的一種常見(jiàn)實(shí)現(xiàn)。所以J.U.C在性能上有了很大的提升。

借助CAS(AtomicReference)實(shí)現(xiàn)單例模式:

public final class SingleInstance {
    private static final AtomicReference<SingleInstance> instanceRef = new AtomicReference<>();

    private SingleInstance() {
    }

    public static SingleInstance getInstance() {
        for (; ; ) {
            SingleInstance instance = instanceRef.get();
            if (instance != null) {
                return instance;
            }
            instanceRef.compareAndSet(null, new SingleInstance());
        }
    }

}

與sychronized實(shí)現(xiàn)的單例相比

優(yōu)點(diǎn):

  1. 無(wú)鎖

缺點(diǎn):

  1. 對(duì)象可能會(huì)被創(chuàng)建多個(gè),設(shè)置失敗的會(huì)被舍棄
  2. 代碼相對(duì)稍微復(fù)雜

參考文章:

最后編輯于
?著作權(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)容

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