AtomicReference實現單例模式


 

CAS是項樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。

樂觀鎖的一種實現方式——CAS

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

借助CAS(AtomicReference)實現單例模式:

 

public class Singleton {
    private static final AtomicReference<Singleton> priveInstance = new AtomicReference<>();

    private Singleton() {
    }
    Singleton getInstance() {
        //如果一直執行不成功,就一直處於死循環中,屬於忙等待算法 
        for(;;){
            if (priveInstance.get() == null) {
                Singleton _newInstance = new Singleton();
                priveInstance.compareAndSet(null, _newInstance);
            }
            return priveInstance.get();
        }
    }
}

 

 

用CAS的好處在於不需要使用傳統的鎖機制來保證線程安全,CAS是一種基於忙等待的算法,依賴底層硬件的實現,相對於鎖它沒有線程切換和阻塞的額外消耗,可以支持較大的並行度。
CAS的一個重要缺點在於如果忙等待一直執行不成功(一直在死循環中),會對CPU造成較大的執行開銷。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM