Java 底層CAS原理 & Concurrent包實現(xiàn)

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 缺點:

  1. ABA問題:就是當修改打掘,從A改成B华畏,再從B改回A。那么CAS算法會當他沒有變化尊蚁,但實際上數(shù)據(jù)是變化了亡笑。
    解決方法: 加入版本控制,每次操作都有版本號窿给。
    處理過程: 先檢查值有沒變化矢洲,如果沒變鱼炒,再檢查版本號琴拧。

  2. 循環(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í)行效率俊鱼。

  3. 只能保證一個共享變量的原子操作:當操作一個共享變量時,可以使用CAS穿香,但一個原子操作有多個共享變量時亭引。我們只能用鎖來解決問題,獲取把多個共享變量合并成一個共享變量皮获。
    解決方法:
    a. 使用鎖控制幾個共享變量焙蚓;
    b. 合并幾個共享變量使用CAS。


concurrent包的實現(xiàn)

由于java的CAS同時具有 volatile 讀和volatile寫的內(nèi)存語義洒宝,因此Java線程之間的通信現(xiàn)在有了下面四種方式:

  1. A線程寫volatile變量购公,隨后B線程讀這個volatile變量。
  2. A線程寫volatile變量雁歌,隨后B線程用CAS更新這個volatile變量宏浩。
  3. A線程用CAS更新一個volatile變量,隨后B線程用CAS更新這個volatile變量靠瞎。
  4. 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)模式:

  1. 首先,聲明共享變量為volatile黔酥;
  2. 然后藻三,使用CAS的原子條件更新來實現(xiàn)線程之間的同步八匠;
  3. 同時,配合以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)示意圖如下:


concurrent結(jié)構(gòu)

參考文檔:
http://www.cnblogs.com/zhuawang/p/4196904.html
concurrent包的實現(xiàn)內(nèi)容完全轉(zhuǎn)載
http://www.cnblogs.com/zhuawang/p/4196904.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仗谆,一起剝皮案震驚了整個濱河市指巡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隶垮,老刑警劉巖藻雪,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狸吞,居然都是意外死亡勉耀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門蹋偏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來便斥,“玉大人,你說我怎么就攤上這事威始∈嗑溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵黎棠,是天一觀的道長晋渺。 經(jīng)常有香客問我,道長脓斩,這世上最難降的妖魔是什么木西? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮俭厚,結(jié)果婚禮上户魏,老公的妹妹穿的比我還像新娘驶臊。我一直安慰自己挪挤,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布关翎。 她就那樣靜靜地躺著扛门,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纵寝。 梳的紋絲不亂的頭發(fā)上论寨,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天星立,我揣著相機與錄音,去河邊找鬼葬凳。 笑死绰垂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的火焰。 我是一名探鬼主播劲装,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昌简!你這毒婦竟也來了占业?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纯赎,失蹤者是張志新(化名)和其女友劉穎谦疾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬金,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡念恍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晚顷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樊诺。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖音同,靈堂內(nèi)的尸體忽然破棺而出词爬,到底是詐尸還是另有隱情,我是刑警寧澤权均,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布顿膨,位于F島的核電站,受9級特大地震影響叽赊,放射性物質(zhì)發(fā)生泄漏恋沃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一必指、第九天 我趴在偏房一處隱蔽的房頂上張望囊咏。 院中可真熱鬧,春花似錦塔橡、人聲如沸梅割。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽户辞。三九已至,卻和暖如春癞谒,著一層夾襖步出監(jiān)牢的瞬間底燎,已是汗流浹背刃榨。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留双仍,地道東北人枢希。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像朱沃,于是被迫代替她去往敵國和親晴玖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容