CAS原子操作

2021-10-04 18:54:44 字數 1129 閱讀 2232

原子操作

什麼是原子操作,打個比方,假如有兩個操作a和b,當執行a的執行緒去看另乙個執行b的執行緒的時候,要麼b執行緒還沒執行,要麼b執行緒執行完了。那麼a跟b之間就是原子的。

如何實現原子操作

實現原子操作的方式,當然有加鎖,比如synchronized加鎖機制可以很好的保證原子操作,但是過於笨重。

例如,當乙個執行緒占有鎖的時候,其他的執行緒就必須等這個執行緒把鎖釋放了才能執行。 那如果 被阻塞的執行緒是優先順序較高的話怎麼辦。還有就是cpu也會花費大量時間和資源來處理這些競爭。還有可能出現死鎖之類的情況。

當然了實現原子操作還可以使用當前處理機基本都支援的cas指令。只不過每 個廠家所實現的演算法並不一樣。

cas每乙個cas操作過程都包括 :

操作的時候,如果這個位址上存放的值v等於這個期望的值a,那麼則將位址上的值賦值為b,否則不做操作。其實就是拿記憶體位址對比舊值,如果記憶體位址的值跟舊值一樣,那麼證明這個值沒有被其他執行緒更改過。如果cas指令操作不成功,則一直迴圈,直到成功為止。

cas的幾個問題

1 、因為在cas的操作時,會檢查值有沒有變化,如果沒有變化則更新。但是如果乙個值從a變成了b,又從b變成了a,但是其他執行緒cas檢查的時候發現值沒有變化,但實際上是已經變化過了。

這就比如,你倒了一杯水放桌子上,幹了點別的事,然後同事把你水喝了又給你重新 倒了一杯水,你回來看水還在,拿起來就喝,如果你不管水中間被人喝過,只關 心水還在,這就是 aba 問題。

解決的方式就是,你在杯子上寫個 1,當這杯子有變動的時候,會把杯子的值累加1,那麼你要確認這個被子裡的水是不是你當初的那杯,沒有被人動過,看編號就知道了。

2、迴圈的時間開銷,假設 cas自旋長時間不成功,會給cpu帶來大的執行開銷

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

當對乙個共享變數執行操作時,我們可以使用迴圈 cas 的方式來保證原子操 作,但是對多個共享變數操作時,迴圈 cas 就無法保證操作的原子性,這個時候 就可以用鎖。

jdk中相關原子操作類的使用

public

class

demo17

}

原子更新基本型別的 atomicinteger,只能更新乙個變數,如果要原子更新多 個變數,就需要使用這個原子更新引用型別提供的類。atomic 包提供了以下 3 個類。

原子操作 CAS

原子操作 cas 利用現代處理器都支援cas指令,迴圈執行cas指令,直至成功。指令級別的保證原子操作。記憶體位址 v 期望值 a 新值 b 當位址v上的值等於a時,就把b賦值給v,若不等於,就不做任何操作,或一直迴圈。1 aba問題 記憶體位址上的值變化 a b a 可以加版本號解決。則值的變化就...

原子操作CAS

原子操作cas cas是一種樂觀鎖思想的應用 cas的原理 cas compare and swap 指令級別保證這是乙個原子操作 三個運算子 乙個記憶體位址v,乙個期望的值a,乙個新值b 基本思路 如果位址v上的值和期望的值a相等,就給位址v賦給新值b,如果不是,不做任何操作。cas問題 1 ab...

原子操作CAS 預備知識

不可被中斷的乙個或一系列操作。比較與交換。cas操作包含三個引數 記憶體位置 預期原值和新值。如果記憶體位置的值與預期原值相匹配,那麼就會給該記憶體位置賦上新值,否則,不做任何操作。aba問題指的是 例如有乙個執行緒a,從記憶體位置v中取出1,之後執行緒b,將該記憶體位置的值變為2,執行緒c又將該記...