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 ...