CAS

之前講鎖的實現(xiàn)的時候講到了CAS魔熏,但沒有詳細的講述CAS是什么鸽扁,只是說明了CAS能保證原子性,那么原子性是什么滓窍?CAS到底又是什么呢巩那?

對于原子性、可見性即横、有序性可以自行學習,如果有時間跺嗽,可以單開一篇講述。

在講CAS之前桨嫁,我們先來想想,在多線程下璃吧,Java如何保證同步,首先會想到的就是synchronized關(guān)鍵字
但是眾所周知筒繁,synchronized是一個重量級的關(guān)鍵字巴元,它會導致有鎖,導致性能不高逮刨。
而volatile只能保證可見性,并不能保證原子性恢总。(volatile的相關(guān)知識可自行學習)
那么為了保證同步箩退,鎖機制是必然需要的离熏。
synchronized是一種獨占鎖戴涝,也是一種悲觀鎖钻蔑,他相信一定有線程去修改他,那么他要讓其他線程掛起等待可帽,直到鎖被釋放窗怒,這樣的效率是較低的。
那么相對的扬虚,樂觀鎖的效率會更高一些,所謂樂觀鎖荸镊,就是相信沒有其他線程去修改他(如果修改失敗了,繼續(xù)重試躬存,直到成功)。

CAS:Compare And Swap
CAS指的是現(xiàn)代CPU廣泛支持的一種對內(nèi)存中的共享數(shù)據(jù)進行操作的特殊指令宛逗。
簡單講一下這個指令的操作過程:首先CPU會將內(nèi)存中需要被更改的數(shù)據(jù)與期望值進行對比钦椭。當兩個值相等時,CPU才會將值替換成新的值彪腔,否則認為更改失敗,不做任何操作德挣。這一系列的操作是原子的。
簡單的說番挺,CAS指令有三個參數(shù)屯掖,內(nèi)存值V,舊的預期值A贴铜,新的修改的值B,當且僅當內(nèi)存值V和舊的預期值A相同時徘意,內(nèi)存值V才會修改成B轩褐。

CAS會帶來一個著名的ABA問題
1.進程P1在共享變量中讀到值為A
2.P1被搶占了,進程P2執(zhí)行
3.P2把共享變量里的值從A改成了B把介,再改回到A,此時被P1搶占脚牍。
4.P1回來看到共享變量里的值沒有被改變,于是繼續(xù)執(zhí)行莫矗。
盡管CAS還是會成功執(zhí)行,但是這樣會帶來隱藏的問題作谚。

例如現(xiàn)在有一個隊列A->B->C,此時head=A, 通過CAS操作將A替換成B,此時進程P1在內(nèi)存的共享變量中讀到值為A
在這個時候進程P1被搶占了雀监,進程P2執(zhí)行
P2把A,B,C三個值都pop掉眨唬,再將A,C,D三個值push進來,此時隊列變成了A->C->D瓦宜,但是head仍為A,此時被P1搶占
P1回來看到共享變量里面的值沒有被改變临庇,于是繼續(xù)執(zhí)行昵慌,此時head就變成了B,此時B.next = null, 隊列里就只剩下了B斋攀,丟失了C、D兩個值侧蘸。
對于ABA問題肖方,一般的解決方案是加上版本號來區(qū)分是否真的沒有被修改過未状,在Java中AtomicStampedReference<E>也實現(xiàn)了這個作用,有興趣的可以了解一下司草,其實質(zhì)是將共享變量和版本號包裝成一個對象來進行CAS操作, 每次CAS傳入共享變量和版本號的舊值和新值,來判斷共享變量是否真的沒有被改變過猜憎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔课,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柬讨,更是在濱河造成了極大的恐慌,老刑警劉巖踩官,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗牡,死亡現(xiàn)場離奇詭異颖系,居然都是意外死亡,警方通過查閱死者的電腦和手機嘁扼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門黔攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莲绰,你說我怎么就攤上這事姑丑。” “怎么了栅哀?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵留拾,是天一觀的道長。 經(jīng)常有香客問我痴柔,道長,這世上最難降的妖魔是什么咳蔚? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任谈火,我火速辦了婚禮,結(jié)果婚禮上糯耍,老公的妹妹穿的比我還像新娘囊嘉。我一直安慰自己革为,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布焊刹。 她就那樣靜靜地躺著恳蹲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘉蕾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天儡率,我揣著相機與錄音以清,去河邊找鬼。 笑死眉孩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的浪汪。 我是一名探鬼主播凛虽,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀潭!你這毒婦竟也來了瓦阐?” 一聲冷哼從身側(cè)響起篷牌,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枷颊,沒想到半個月后该面,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體信卡,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡傍菇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牵触。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揽思,死狀恐怖见擦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损痰,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布徐钠,位于F島的核電站役首,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爹袁。R本人自食惡果不足惜矮固,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望档址。 院中可真熱鬧,春花似錦绎秒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阅懦。三九已至徘铝,卻和暖如春耳胎,著一層夾襖步出監(jiān)牢的瞬間惕它,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工诗轻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揭北,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓恨樟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劝术。 傳聞我的和親對象是個殘疾皇子呆奕,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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