前言
CAS,即 Compare And Swap(比較與交換),是一種無鎖算法,基於硬件原語實現,能夠在不使用鎖的情況下實現多線程之間的變量同步。jdk中的java.util.concurrent.atomic包中的原子類就是通過CAS來實現了樂觀鎖。
CAS算法過程
算法涉及到三個操作數:
- 需要讀寫的內存位置V
- 需要進行比較的預期值A
- 需要寫入的新值U
CAS算法解析:
CAS具體執行時,當且僅當預期值A符合內存地址V中存儲的值時,就用新值U替換掉舊值,並寫入到內存地址V中。否則不做更新。
CAS算法的運行原理如下如所示:
CAS會有如下三個方面的問題:
1.ABA問題,一個線程將內存值從A改為B,另一個線程又從B改回到A。
2.循環時間長開銷大:CAS算法需要不斷地自旋來讀取最新的內存值,長時間讀取不到就會造成不必要的CPU開銷。
3. 只能保證一個共享變量的原子操作(jdk的AtomicReference來保證應用對象之間的原子性,可以把多個變量放在一個對象里來進行CAS操作,解決了這一問題)。
ABA問題圖解:
ABA問題解決方案:在變量前面添加版本號,每次變量更新的時候都將版本號加1,比如juc的原子包中的AtomicStampedReference類。