Cas簡單理解

2021-10-04 12:08:02 字數 2331 閱讀 4821

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