CAS 樂觀鎖策略

2021-09-26 22:32:16 字數 770 閱讀 5424

cas,即compare and swap,比較後再交換,使用的場景:

執行緒1執行如下指令:

read a; a++;write a;

執行緒2執行如下指令:

read a;a++;write a;

此時有這樣的執行順序:

此時如果a的初始值為0,那麼兩個執行緒執行完最後的結果為1,而不是2。

**如下:

public final int getandaddint(object var1, long var2, int var4)  while(!this.compareandswapint(var1, var2, var5, var5 + var4));

return var5;

}

compareandswapint做這樣的操作:

首先拿老值(var5)去和記憶體中再讀取一次的值進行比較,如果不一樣了,說明有其他執行緒修改了這個值,此時compareandswapint執行失敗,再重複迴圈,直到有一次老值和從記憶體中再次讀取到的值一樣了,再進行計算,並將值寫回主記憶體中以讓其他執行緒感知到。compareandswapint是乙個原子操作,即執行cas操作的執行緒不會被打斷,因此不會出現比較操作完並確定兩個值一樣時,記憶體中這個位址的值再度被修改的情況,即一旦確定老值和從主存中讀取的新值一樣時,這個位址上的值直到這個執行緒執行完compareandswapint之前都不會被其他執行緒改變,確保了加1操作後不會出現期望外的值。

樂觀鎖 CAS演算法

cas全稱 compare and swap 比較與交換 是一種無鎖演算法。在不使用鎖 沒有執行緒被阻塞 的情況下實現多執行緒之間的變數同步。j a.util.concurrent包中的原子類就是通過cas來實現了樂觀鎖。cas演算法涉及到三個運算元 當且僅當 v 的值等於 a 時,cas通過原子方...

樂觀鎖與CAS操作

atomicinteger來研究在沒有鎖的情況下是如何做到資料正確性的?這裡舉例說明乙個方法 getandincrement public final int getandincrement 這裡面有個compareandset方法,其實是jni呼叫,在這裡採用了cas操作,每次從記憶體中讀取資料然...

CAS機制 樂觀鎖的基礎

cas,即compare and swap,比較並交換。更新乙個變數的時候,只有當變數的預期值a和記憶體位址v當中的實際值相同時,才會將記憶體位址v對應的值修改為b。cas操作的就是樂觀鎖,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。非阻塞 1.volatile...