CAS又是怎樣保證原子性的?

2021-09-29 21:44:26 字數 839 閱讀 4165

a.什麼是cas?

<1>全稱是compareandset,含義是比較並交換。

<2>cas有3個運算元,記憶體值v,舊的預期值a,要修改的新值b。當且僅當預期值a和記憶體值v相同時,將記憶體值v修改為b,否則返回v

b.下面來看下atomicinteger.incrementandget()的原始碼

public final int incrementandget() 

} private volatile int value;

public final int get()

public final boolean compareandset(int expect,int update)

可以看到原始碼中的for迴圈本質就是while(true),只有當滿足if條件時才會返回並跳出while(true)迴圈,這個迴圈有乙個專有名詞就是自旋

<1>.如何保證get()方法返回的是記憶體中最新值?value被volatile修飾,volatile保證了可見性,自然是最新值

<2>.可以看出compareandset方法底層呼叫的是compareandswapint(),compareandswapint()的執行過程又是怎樣的呢?/compareandset方法是如何保證原子性操作的?

(1)通過this+valueoff獲取當前主存中的最新值

(2)將最新值和expect進行比較,如果而知值相等,將this+valueoff對應的值修改為update,並返回true,如果不等則返回false

這樣就會發現,只有當compareandset方法中的get()當前讀到的值和主存中的實際值相等時才可以修改,這樣就保障了原子性。

volatile不能保證原子性

在討論原子性操作時,我們經常會聽到乙個說法 任意單個volatile變數的讀寫具有原子性,但是volatile 這種操作除外。所以問題就是 為什麼volatile 不是原子性的?因為它實際上是三個操作組成的乙個符合操作。首先獲取volatile變數的值 將該變數的值加1 將該volatile變數的值...

volatile不保證原子性

1.什麼是原子性?不可分割 完整性,即某個執行緒正在做某個具體業務時,中間不可以被加塞或者被分割,需要整體完整,要麼同時成功,要麼同時失敗 2.寫乙個demo來驗證volatile不保證原子性 大概率結果不是2000 因為i 不是一步操作,而不是一步操作,所以無法保證原子性 class source...

volatile能保證原子性嗎?

volatile不能保證原子性。當跟自增操作一起時,自增操作本身不是原子性操作。class data public class main string.valueof i start while thread.activecount 2 system.out.println data.number ...