上篇文章中我們提到了悲觀鎖和樂觀鎖郑趁,我們知道樂觀鎖的一種實現(xiàn)方式就是CAS算法辉词。但CAS在Java中的應用遠不止于此风纠。
首先我們了解下CAS的概念:它是一種通過對比預期值的方式保證同步的思想,比如一個變量的值是V1磁餐,當我要修改這個變量時肠牲,我會先將它目前的值和V1比較幼衰,若相等則修改,若不相等則重試一定次數(shù)缀雳。
下面介紹一部分CAS在Java中的應用:
1.AtomicInteger等原子類的線程安全
2.JDK1.8中ConcurrentHashMap的線程安全(更新size時使用)
3.ReenTrantLock中更改鎖狀態(tài)
4.創(chuàng)建對象的內(nèi)存分配線程安全性
后續(xù)文章會詳細介紹上面的每一種應用實現(xiàn)渡嚣。
但CAS也有它的缺陷:
1.可能產(chǎn)生ABA的問題
接著上面的例子,變量值為V1肥印,有可能是變成V2后又變回了V1识椰,這在CAS看來是未曾改變過。這個缺陷可以結(jié)合版本號(?AtomicStampedReference)來解決深碱。
2.循環(huán)時長開銷比較大
重試次數(shù)過大導致的資源浪費