CAS:對于內存中的某一個值V,提供一個舊值A和一個新值B。如果提供的舊值V和A相等就把B寫入V。這個過程是原子性的。
CAS執行結果要么成功要么失敗,對于失敗的情形下一班采用不斷重試。或者放棄。
ABA:如果另一個線程修改V值假設原來是A,先修改成B,再修改回成A。當前線程的CAS操作無法分辨當前V值是否發生過變化。
關于ABA問題我想了一個例子:在你非常渴的情況下你發現一個盛滿水的杯子,你一飲而盡。之后再給杯子里重新倒滿水。然后你離開,當杯子的真正主人回來時看到杯子還是盛滿水,他當然不知道是否被人喝完重新倒滿。解決這個問題的方案的一個策略是每一次倒水假設有一個自動記錄儀記錄下,這樣主人回來就可以分辨在她離開后是否發生過重新倒滿的情況。這也是解決ABA問題目前采用的策略。
解決方案:增加一個版本號的比較:AutoStampedReferenced類解決 ,引用計數、序列號或者HazardPointer等技術來避免ABA問題
?