aba問題
執行緒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。
posted @ 2019-03-18 21:05
編輯收藏
CAS的ABA問題詳解
在多執行緒場景下cas會出現aba問題,關於aba問題這裡簡單科普下,例如有2個執行緒同時對同乙個值 初始值為a 進行cas操作,這三個執行緒如下 1.執行緒1,期望值為a,欲更新的值為b 2.執行緒2,期望值為a,欲更新的值為b 執行緒1搶先獲得cpu時間片,而執行緒2因為其他原因阻塞了,執行緒1...
併發程式設計cas的aba問題
多執行緒環境下,兩個執行緒a,b可能會對共享資料m進行操作。為了保證乙個執行緒在讀到資料跟寫入資料之間沒有被其他執行緒修改過,使用cas解決。cas 更改之前先判斷舊值是否有變化,如果沒有變化,認為沒有執行緒對該共享值做過操作。這種認為是有一下問題的,時執行緒a 執行緒bt1 讀m值為1 t2讀m值...
CAS及其引起的ABA問題
cas 是什麼也就是比較並交換 compareandset cas全稱為compare and swap,它是一條cpu併發原語。呼叫unsafe類中的cas方法,jvm發出cas彙編指令,這是偏硬體的功能。而原語的執行必須是連續的,在執行過程中不允許被終端。也就說cas是一條cpu的原子指令。ca...