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