CAS知道嗎?如何實現的?

2021-10-10 08:36:20 字數 1631 閱讀 3657

cas—compareandset字面意思:比較並互動

真實值和期望值相同,執行修改,否則不執行。

cas方法存在於unsafe類中,unsafe可以直接作業系統記憶體資源。

cas是一種系統原語,屬於作業系統用語,是有若干條連續不可中斷的指令構成的,也就是說,cas是一條cpu的原子指令

我們以unsafe的getandsetint方法為例

這個方法的作用是,獲得並且設定乙個int值,返回獲得的結果

public

final

intgetandsetint

(object var1,

long var2,

int var4)

while(!

this

.compareandswapint

(var1, var2, var5, var4));

return var5;

}

首先這個方法接收4個引數,第乙個為物件,第二個是記憶體位址偏移量,我們通過這兩個引數,直接從記憶體中獲得我們需要的運算元var5

while裡的判斷條件,就是乙個本地的cas方法,比較並交換int值

public

final

native

boolean

compareandswapint

(object var1,

long var2,

int var4,

int var5)

;

這是個返回boolean的方法,意思是:如果期望值和實際值相等,則交換,返回true,否則返回false。這個方法以在cpu級別保證了原子性,不會發生資料不一致問題。

再回到上面的迴圈,如果cas交換成功,返回true,那麼迴圈條件整體為false,退出迴圈,返回更新之前的運算元,如果cas交換失敗,那麼則會一直重複這個do-while迴圈,不停的取值,嘗試比較並交換。我們把它稱之為自旋

aba故名思意,a變成了b又變成了a,從結果上看,a並沒有改變,但實際上是a改變了多次。

以cas的機制是不能意識到變數是改變了多次的。

juc提供了atomicstampedreference,即帶戳的原子引用類,可以理解為有版本號的原子引用

atomicstampedreference

asr =

newatomicstampedreference

<

>

(100,1

)

通過版本號,解決aba的問題,這樣引用和預期相同,版本號卻和預期不相通,不能執行cas操作

boolean res = asr.

compareandset

(exceptref, newref,exceptstamp,newstamp)

;

cas是cpu級別的原子指令,保證了資料一致性

cas提公升了併發效率,也增大了cpu開銷(因為一直自旋的原因)

cas只能保證乙個共享變數的原子性

cas存在aba的問題,可以使用atomicstampedreference類來解決。

這些你都知道嗎?

如果身邊有胃不好的人,請分享給ta 1 最養胃的,麵條 2 如果熬粥,少放點蘇打進去,3 小公尺粥就饅頭,可以養胃。4 有兩種飲料應該多喝,一是牛奶,二是熱水。5 胃不好,要少食多餐。6 大棗 豆腐 白菜 牛奶 胡蘿蔔 健脾和胃。7 花生,蜂蜜都是養胃的。8 紅茶 蜂蜜.十分養胃。計 喝水 法 1 ...

親愛的,你知道嗎?

親愛的,莫怪我,我實在太累了,親愛的,莫怪我,因為我覺得無法學會自私,親愛的,莫怪我,因為我覺得自己心裡太小,小的只能容下我愛你三個字,無法容下任何,因此我把自己丟了,只剩下陪伴你的軀殼,親愛的,因為我喪失了靈魂,所以在你面前如此狼狽,親愛的,因為我自己無法面對現實,所以我哭泣的近似瘋了,親愛的,因...

索引的缺點 你知道嗎?

我們一般都會關心 索引的優點 為什麼要建立 索引 有什麼好處?索引的適應場景,可我沒有注意到 它給我們帶來什麼弊端。接下來總結歸納一下吧。什麼是索引?索引 按我的理解 就是乙個具有標誌性的名稱,相當於一本字典目錄 能根據這個索引 查到自己想到的字。索引的作用 索引分類有哪些?普通索引 普通字段,方便...