CAS的ABA問題詳解


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM