CAS原理以及CAS帶來的三大問題

  1. CAS是什么洒忧?
  2. CAS帶來的三大問題
    • ABA問題
    • 循環(huán)時(shí)間長(zhǎng)開銷大
    • 只能保證一個(gè)共享變量的原子操作

參考:http://www.reibang.com/p/ab2c8fce878b
http://www.reibang.com/p/68f9cd012de8

1. CAS是什么?

CAS:Compare and Swap摊灭,即比較再交換祝辣。

CAS算法理解:CAS是一種無鎖算法畜号,CAS有3個(gè)操作數(shù),內(nèi)存值E簇抵,舊的預(yù)期值V庆杜,要修改的新值N。當(dāng)且僅當(dāng)預(yù)期值V和內(nèi)存值E相同時(shí)碟摆,將內(nèi)存值E修改為N晃财,否則什么都不做匿刮。

CAS算法圖解

image.png

上圖描述了CAS的原理毡代,以及帶來的三大問題以及問題出現(xiàn)的位置轧叽。

2. CAS帶來的三大問題

1.ABA問題
因?yàn)镃AS需要在操作值的時(shí)候肛跌,檢查值有沒有發(fā)生變化,如果沒有發(fā)生變化則更新钢猛,但是如果一個(gè)值原來是A伙菜,變成了B,又變成了A命迈,那么CAS進(jìn)行檢查的時(shí)候發(fā)現(xiàn)它的值沒有發(fā)生變化贩绕,但是實(shí)際上卻變化了。ABA問題的解決思路就是使用版本號(hào)壶愤。在變量前面加上版本號(hào)丧叽,每次變量更新的時(shí)候把版本號(hào)加1,那么A->B->A就會(huì)變成1A->2B->3A公你。從Java 1.5開始,JDK的Atomic包里提供了一個(gè)類AtomicStampedReference來解決ABA問題假瞬。這個(gè)類的compareAndSet方法的作用是首先檢查當(dāng)前引用是否等于預(yù)期引用陕靠,并且檢查當(dāng)前的標(biāo)志是否等于預(yù)期標(biāo)志,如果全部相等脱茉,則以原子方式將該應(yīng)用和該標(biāo)志的值設(shè)置為給定的更新值剪芥。

2.循環(huán)時(shí)間長(zhǎng)開銷大
自旋CAS如果長(zhǎng)時(shí)間不成功,會(huì)給CPU帶來非常大的執(zhí)行開銷琴许,如果JVM能支持處理器提供的pause指令税肪,那么效率會(huì)有一定的提升。pause指令有兩個(gè)作用:第一榜田,它可以延遲流水線執(zhí)行指令(de-pipeline)益兄,使CPU不會(huì)消耗過多的執(zhí)行資源,延遲的時(shí)間取決于具體實(shí)現(xiàn)的版本箭券,在一些處理器上延遲時(shí)間是零净捅;第二,它可以避免在循環(huán)的時(shí)候因內(nèi)存順序沖突(Memory Order Violation)而引起CPU流水線被清空辩块,從而提高CPU的實(shí)行效率蛔六。

3.只能保證一個(gè)共享變量的原子操作
當(dāng)對(duì)一個(gè)共享變量執(zhí)行操作時(shí),我們可以使用循環(huán)CAS的方式來保證原子操作废亭,但是對(duì)多個(gè)共享變量操作時(shí)国章,循環(huán)CAS就無法保證操作的原子性,這個(gè)時(shí)候可以用鎖豆村。還有一個(gè)取巧的辦法液兽,就是把多個(gè)共享變量合并成一個(gè)共享變量來操作。比如你画,有兩個(gè)共享變量i=2,j=a,合并一下ji=2a,然后用CAS來操作ij抵碟。從Java 1.5開始桃漾,JDK提供了AtomicReference類來保證引用對(duì)象之前的原子性,就可以把多個(gè)變量放在一個(gè)對(duì)象里來進(jìn)行CAS操作拟逮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撬统,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敦迄,更是在濱河造成了極大的恐慌恋追,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罚屋,死亡現(xiàn)場(chǎng)離奇詭異苦囱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脾猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門撕彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猛拴,你說我怎么就攤上這事羹铅。” “怎么了愉昆?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵职员,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我跛溉,道長(zhǎng)焊切,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任芳室,我火速辦了婚禮专肪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堪侯。我一直安慰自己牵祟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布抖格。 她就那樣靜靜地躺著诺苹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雹拄。 梳的紋絲不亂的頭發(fā)上收奔,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音滓玖,去河邊找鬼坪哄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翩肌。 我是一名探鬼主播模暗,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼念祭!你這毒婦竟也來了兑宇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤粱坤,失蹤者是張志新(化名)和其女友劉穎隶糕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站玄,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枚驻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了株旷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再登。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晾剖,靈堂內(nèi)的尸體忽然破棺而出霎冯,到底是詐尸還是另有隱情,我是刑警寧澤钞瀑,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站慷荔,受9級(jí)特大地震影響雕什,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜显晶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一贷岸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磷雇,春花似錦偿警、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崩掘,卻和暖如春七嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苞慢。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工诵原, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓绍赛,卻偏偏與公主長(zhǎng)得像蔓纠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吗蚌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345