CAS的ABA問題詳解
ABA問題
- 在多線程場景下CAS會出現ABA問題,關於ABA問題這里簡單科普下,例如有2個線程同時對同一個值(初始值為A)進行CAS操作,這三個線程如下
- 1.線程1,期望值為A,欲更新的值為B
- 2.線程2,期望值為A,欲更新的值為B
- 線程1搶先獲得CPU時間片,而線程2因為其他原因阻塞了,線程1取值與期望的A值比較,發現相等然后將值更新為B,然后這個時候出現了線程3,期望值為B,欲更新的值為A,線程3取值與期望的值B比較,發現相等則將值更新為A,此時線程2從阻塞中恢復,並且獲得了CPU時間片,這時候線程2取值與期望的值A比較,發現相等則將值更新為B,雖然線程2也完成了操作,但是線程2並不知道值已經經過了A->B->A的變化過程。
ABA問題帶來的危害:
- 小明在提款機,提取了50元,因為提款機問題,有兩個線程,同時把余額從100變為50
線程1(提款機):獲取當前值100,期望更新為50,
線程2(提款機):獲取當前值100,期望更新為50,
線程1成功執行,線程2某種原因block了,這時,某人給小明匯款50
線程3(默認):獲取當前值50,期望更新為100,
這時候線程3成功執行,余額變為100,
線程2從Block中恢復,獲取到的也是100,compare之后,繼續更新余額為50!!!
此時可以看到,實際余額應該為100(100-50+50),但是實際上變為了50(100-50+50-50)這就是ABA問題帶來的成功提交。 - 解決方法: 在變量前面加上版本號,每次變量更新的時候變量的版本號都+1,即A->B->A就變成了1A->2B->3A。
