CAS是英文單詞Compare And Swap的縮寫,翻譯過來就是比較並替換。
CAS機制當中使用了3個基本操作數:內存地址V,舊的預期值A,要修改的新值B。
CAS的缺點:
1.CPU開銷較大
在並發量比較高的情況下,如果許多線程反復嘗試更新某一個變量,卻又一直更新不成功,循環往復,會給CPU帶來很大的壓力。
2.不能保證代碼塊的原子性
CAS機制所保證的只是一個變量的原子性操作,而不能保證整個代碼塊的原子性。比如需要保證3個變量共同進行原子性的更新,就不得不使用Synchronized了。
3.ABA問題
這是CAS機制最大的問題所在。
什么是ABA問題?
引用原書的話:如果在算法中的節點可以被循環使用,那么在使用“比較並交換”指令就可能出現這種問題,在CAS操作中將判斷“V的值是否仍然為A?”,並且如果是的話就繼續執行更新操作,在某些算法中,如果V的值首先由A變為B,再由B變為A,那么CAS將會操作成功。
怎么避免ABA問題?
Java中提供了AtomicStampedReference和AtomicMarkableReference來解決ABA問題。