CAS:
Compare and Swap, 翻譯成比較并交換识虚。
java.util.concurrent包中借助CAS實現(xiàn)了區(qū)別于synchronouse同步鎖的一種樂觀鎖缀程。
CAS實現(xiàn)原理:
CAS有3個操作數(shù)典蝌,內(nèi)存值V,舊的預(yù)期值A(chǔ)搀别,要修改的新值B提澎。當且僅當預(yù)期值A(chǔ)和內(nèi)存值V相同時砌滞,將內(nèi)存值V修改為B侮邀,否則什么都不做。
boolean compareAndSwap( V, A, B){
if (V != A) {
return false;
} else {
V = B;
return true;
}
}
這個過程在硬件層面實現(xiàn)的贝润,Java主要用JNI類 UNSAFE實現(xiàn)的绊茧。
這里不詳細描述其具實現(xiàn),詳情:UNSAFE詳情
CAS 缺點:
ABA問題:就是當修改打掘,從A改成B华畏,再從B改回A。那么CAS算法會當他沒有變化尊蚁,但實際上數(shù)據(jù)是變化了亡笑。
解決方法: 加入版本控制,每次操作都有版本號窿给。
處理過程: 先檢查值有沒變化矢洲,如果沒變鱼炒,再檢查版本號琴拧。循環(huán)時間過長:CAS如果長時間不成功晰甚,就會浪費掉非常多的CPU資源衙传。
解決方法:pause指令。有兩個作用:
a. 可以延遲流水線執(zhí)行指令(de-pipeline),使CPU不會消耗過多的執(zhí)行資源厕九,延遲的時間取決于具體實現(xiàn)的版本蓖捶,在一些處理器上延遲時間是零。
b. 可以避免在退出循環(huán)的時候因內(nèi)存順序沖突(memory order violation)而引起CPU流水線被清空(CPU pipeline flush)扁远,從而提高CPU的執(zhí)行效率俊鱼。只能保證一個共享變量的原子操作:當操作一個共享變量時,可以使用CAS穿香,但一個原子操作有多個共享變量時亭引。我們只能用鎖來解決問題,獲取把多個共享變量合并成一個共享變量皮获。
解決方法:
a. 使用鎖控制幾個共享變量焙蚓;
b. 合并幾個共享變量使用CAS。
concurrent包的實現(xiàn)
由于java的CAS同時具有 volatile 讀和volatile寫的內(nèi)存語義洒宝,因此Java線程之間的通信現(xiàn)在有了下面四種方式:
- A線程寫volatile變量购公,隨后B線程讀這個volatile變量。
- A線程寫volatile變量雁歌,隨后B線程用CAS更新這個volatile變量宏浩。
- A線程用CAS更新一個volatile變量,隨后B線程用CAS更新這個volatile變量靠瞎。
- A線程用CAS更新一個volatile變量比庄,隨后B線程讀這個volatile變量。
Java的CAS會使用現(xiàn)代處理器上提供的高效機器級別原子指令乏盐,這些原子指令以原子方式對內(nèi)存執(zhí)行讀-改-寫操作佳窑,這是在多處理器中實現(xiàn)同步的關(guān)鍵(從本質(zhì)上來說,能夠支持原子性讀-改-寫指令的計算機器父能,是順序計算圖靈機的異步等價機器神凑,因此任何現(xiàn)代的多處理器都會去支持某種能對內(nèi)存執(zhí)行原子性讀-改-寫操作的原子指令)。同時何吝,volatile變量的讀/寫和CAS可以實現(xiàn)線程之間的通信溉委。把這些特性整合在一起,就形成了整個concurrent包得以實現(xiàn)的基石爱榕。如果我們仔細分析concurrent包的源代碼實現(xiàn)瓣喊,會發(fā)現(xiàn)一個通用化的實現(xiàn)模式:
- 首先,聲明共享變量為volatile黔酥;
- 然后藻三,使用CAS的原子條件更新來實現(xiàn)線程之間的同步八匠;
- 同時,配合以volatile的讀/寫和CAS所具有的volatile讀和寫的內(nèi)存語義來實現(xiàn)線程之間的通信趴酣。
AQS梨树,非阻塞數(shù)據(jù)結(jié)構(gòu)和原子變量類(java.util.concurrent.atomic包中的類),這些concurrent包中的基礎(chǔ)類都是使用這種模式來實現(xiàn)的岖寞,而concurrent包中的高層類又是依賴于這些基礎(chǔ)類來實現(xiàn)的抡四。從整體來看,concurrent包的實現(xiàn)示意圖如下:
參考文檔:
http://www.cnblogs.com/zhuawang/p/4196904.html
concurrent包的實現(xiàn)內(nèi)容完全轉(zhuǎn)載
http://www.cnblogs.com/zhuawang/p/4196904.html