多執行緒環境下,兩個執行緒a,b可能會對共享資料m進行操作。為了保證乙個執行緒在讀到資料跟寫入資料之間沒有被其他執行緒修改過,使用cas解決。
cas:更改之前先判斷舊值是否有變化,如果沒有變化,認為沒有執行緒對該共享值做過操作。(
這種認為是有一下問題的,
時執行緒a
執行緒bt1
讀m值為1
t2讀m值為1
t3查詢m值是否為1,並更新m值為2
t4讀m值為2
t5查詢m值是否為2,並更新m值為1
t6查詢m值是否為1,並更新m值為2
b執行緒已經對資料做了兩次修改,而a卻並不清楚這個修改,以為是沒有任何執行緒對其做修改。
這個問題稱之為aba。
aba問題解決:使用修改欄位加時間戳,在cas判斷m值的時候,同時對時間戳進行判斷。如果時間戳不一樣,說明其他執行緒對該字段進行了修改。
CAS的ABA問題詳解
aba問題 執行緒1搶先獲得cpu時間片,而執行緒2因為其他原因阻塞了,執行緒1取值與期望的a值比較,發現相等然後將值更新為b,然後這個時候出現了執行緒3,期望值為b,欲更新的值為a,執行緒3取值與期望的值b比較,發現相等則將值更新為a,此時執行緒2從阻塞中恢復,並且獲得了cpu時間片,這時候執行緒...
CAS的ABA問題詳解
在多執行緒場景下cas會出現aba問題,關於aba問題這裡簡單科普下,例如有2個執行緒同時對同乙個值 初始值為a 進行cas操作,這三個執行緒如下 1.執行緒1,期望值為a,欲更新的值為b 2.執行緒2,期望值為a,欲更新的值為b 執行緒1搶先獲得cpu時間片,而執行緒2因為其他原因阻塞了,執行緒1...
CAS及其引起的ABA問題
cas 是什麼也就是比較並交換 compareandset cas全稱為compare and swap,它是一條cpu併發原語。呼叫unsafe類中的cas方法,jvm發出cas彙編指令,這是偏硬體的功能。而原語的執行必須是連續的,在執行過程中不允許被終端。也就說cas是一條cpu的原子指令。ca...