cas全稱compare-and-swap,簡單理解就是比較更新,和記憶體中指定位置上的值進行比較,如果期望的值和自己的值一致,則把指定位置上的值替換為自己想要的值。他是sun.misc.unsafe類下的native操作,操作的過程是原子操作。(don『』t talk, show the code!)
##下面是cas乙個簡單的應用(atomicinteger相信大家都並不陌生)
public
class
lockdemo
public
static
void
main
(string[
] args) throws interruptedexception })
.start()
;}thread.
sleep
(2000l)
; system.
out.
printf
("i="
+ demo.i);}
}
下面是執行結果:
下面我們一起看看atomicinteger是怎麼實現原子操作的:
atomicinteger的原子加法(其實該類的幾個方法原理都差不太多);
/**
* atomically increments by one the current value.
* * @return the updated value
*/public final int
incrementandget()
這個裡面呼叫了unsafe的getandaddint方法,我們且去看一看這個方法:
public final int
getandaddint
(object var1,
long var2,
int var4)
while(!
this
.compareandswapint
(var1, var2, var5, var5 + var4));
return var5;
}
其中的compareandswapint就是cas操作的體現,下面是jdk源方法
public final native boolean compareandswapint
(object var1,
long var2,
int var4,
int var5)
;
cas應用廣泛,比如可重入鎖(reentrantlock),訊號量(semaphore),監視器(countdownlanch),執行緒柵欄(cyclicbarrier)都有它的蹤跡。
2.下面我們嘗試自己去寫乙個類似的加法,以便於深入理解cas
public
class
lockdemo1
catch
(exception
var)
}private
void
add(
)while(!
unsafe
.compareandswapint
(this
, valueoffset, current, current +1)
);//可能會失敗
}public
static
void
main
(string[
] args) throws interruptedexception })
.start()
;}thread.
sleep
(2000l)
; system.
out.
printf
("i ="
+ demo.
value);
}}
其執行結果和上面的atomicinteger 一模一樣
3.cas有沒有什麼缺點呢?
答案是有。比如上面的do while迴圈中 如果cas操作一直失敗,那麼迴圈就會一直處於重試;還有就是有名的aba問題,執行緒t把資源的a值進行改變從a改為b再次a,如果另外的執行緒獲取到的最新值還是a,那麼問題就會產生,其中有名的解決方法就是修改的時候加入版本號的概念。
對CAS的理解
比較並交換 compare and set public class casdemo atomicinteger.compareandset a,b 1 前乙個值為期望值,期望物理記憶體的值與該值相同 2 若真實值與期望值相同就將值改為b,並寫入物理記憶體,若不同,則不寫 unsafe類的getan...
對cas演算法的理解
對cas演算法的理解 cas演算法主要關心3個值 記憶體值v,預期值a,要更新的新值b。注 t1,t2執行緒是同時更新同一變數56的值 因為t1和t2執行緒都同時去訪問同一變數56,所以他們會把主記憶體的值完全拷貝乙份到自己的工作記憶體空間,所以t1和t2執行緒的預期值都為56。假設t1在與t2執行...
深入理解CAS與AQS
二 aqs 首先,cas是一種演算法,不是鎖cas,其實是個簡稱,全稱是 compare and swap,對比之後交換資料 expect 期望更新的值 一開始獲取的值 update 要更新的最新值 如果原子變數中的 value 值等於 expect,則使用 update 值更新該值並返回 true...