CAS及其引起的ABA問題

2021-10-07 06:09:22 字數 1281 閱讀 3703

cas

是什麼也就是比較並交換(

compareandset)cas全稱為compare-and-swap,它是一條cpu併發原語。呼叫unsafe類中的cas方法,jvm發出cas彙編指令,這是偏硬體的功能。而原語的執行必須是連續的,在執行過程中不允許被終端。也就說cas是一條cpu的原子指令。

cas底層原理:

atomicinteger類下:

private static final unsafe unsafe=unsafe.getunsafe(); 

private static final llong valueoffset;

staticcatch(exception ex)

}private volatile int value;

unsafe

是cas的核心類,存在於sun.misc包中 注:unsafe類中的所有方法都是native修飾的,其中的方法都是直接呼叫作業系統底層的資源執行相應的任務

變數valueoffset表示變數值在記憶體總的偏移位址,unsafe就是根據記憶體偏移位址獲取資料的

publicfinalintgetandincrement()

變數value

用volatile

修飾,保證了多執行緒之間的記憶體可見性

圖為2中底層**的詳細講解

cas小總結

cas的缺點:

迴圈時間長,開銷比較大

只能保證乙個共享變數的原子操作

引出來的aba問題:cas演算法實現的乙個重要前提需要去除記憶體中某時刻的資料並在當下時刻比較並替換,那麼在這個時間差內會導致資料的變化

原子類atomicinteger的aba問題,原子更新引用

原子引用:

時間戳的原子引用;

原子引用+一種新機制

à修改版本號(類似於時間戳)

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問題

多執行緒環境下,兩個執行緒a,b可能會對共享資料m進行操作。為了保證乙個執行緒在讀到資料跟寫入資料之間沒有被其他執行緒修改過,使用cas解決。cas 更改之前先判斷舊值是否有變化,如果沒有變化,認為沒有執行緒對該共享值做過操作。這種認為是有一下問題的,時執行緒a 執行緒bt1 讀m值為1 t2讀m值...