比較並交換(compare and set)
public class casdemo
}
atomicinteger.compareandset(a,b)1)前乙個值為期望值,期望物理記憶體的值與該值相同
2)若真實值與期望值相同就將值改為b,並寫入物理記憶體,若不同,則不寫
unsafe類的getandaddinte()方法+cas思想
var1---atomicintger物件本身
var2---該物件值的引用位址
var4---需要變動的數量
var5---用過var1和var2找出的主記憶體中真實的值
用該物件當前的值與var5比較:
如果相同,更新var5+var4,並且返回true
如果不同,繼續取值然後再比較,直到更新完成
若用鎖,則保證了一致性,併發性卻下降了。而用do-while模型則可以實現自旋,又保證了併發性
1)atomicinteger裡面的value原始值為3,即主記憶體中atomicinteger的value為3,根據jmm模型,執行緒a和執行緒b各自持有乙份值為3的value的副本分別到各自的工作記憶體
2)執行緒a通過getintvolatile(var1,var2)拿到value值3,這時執行緒a被掛起
3)執行緒b也通過getintvolatile方法獲取到value值3,此時剛好執行緒b沒有被掛起並執行compareandswapint方法比較記憶體值也為3,成功修改記憶體值為4
4)這時執行緒a恢復,執行compareandswapint方法比較,發現自己手裡的值數字3和主記憶體的值數字4不一致,說明該值已經被其他執行緒搶先一步修改過了,那a執行緒本次修改失敗,只能重新讀取重新來一遍
5)執行緒a重新獲取value值,因為變數value被volatile修飾,所以其他執行緒對它的修改,執行緒a總是能夠看到,執行緒a繼續執行compareandswapint進行比較替換,直到成功
cas:
比較當前工作記憶體中的值和主記憶體中的值,如果相同則執行規定操作,否則繼續比較直到主記憶體和工作記憶體中的值一致為止
cas應用:
cas有3個運算元,記憶體值v,舊的預期值a,要修改的更新值b當且僅當預期值a和記憶體值v相同時,將記憶體之v修改為b,否則說明都不做。一直重複以上過程直到成功為止
1)迴圈時間長,開銷大(do-while)
2)只能保證乙個共享變數的原子操作
3)引出來aba問題(可參考該博文)
對cas演算法的理解
對cas演算法的理解 cas演算法主要關心3個值 記憶體值v,預期值a,要更新的新值b。注 t1,t2執行緒是同時更新同一變數56的值 因為t1和t2執行緒都同時去訪問同一變數56,所以他們會把主記憶體的值完全拷貝乙份到自己的工作記憶體空間,所以t1和t2執行緒的預期值都為56。假設t1在與t2執行...
對CAS單點登陸的理解
cas是實現單點登陸的框架。使用者只需要登陸一次就可以訪問所有相互信任的應用系統。cas通過票據之間的傳遞達到目的。首先明確 cas只是控制分布式集群 的單點登陸,並不負責資源許可權的控制 tgt 登陸票據 表示某使用者登陸 整個系統的票據,session實現。對應多個session tgc tgt...
Cas簡單理解
cas全稱compare and swap,簡單理解就是比較更新,和記憶體中指定位置上的值進行比較,如果期望的值和自己的值一致,則把指定位置上的值替換為自己想要的值。他是sun.misc.unsafe類下的native操作,操作的過程是原子操作。don t talk,show the code 下面...