1. 程式人生 > >AtomicReference實現單例模式

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造成較大的執行開銷。