CAS原則

compare and swap,比較并替換

? ? 思路:三個(gè)參數(shù)酥夭,一個(gè)為當(dāng)前內(nèi)存值V,舊的預(yù)期值為A轻黑,即將更新的值為 B檐嚣。

? ? 當(dāng)且僅當(dāng)V=A時(shí)助泽,將內(nèi)存值修改為B并返回true,否則什么都不做返回false

public int a = 1;

public boolean compareAndSwapInt(int b) {

? ? if (a == 1) {

? ? ? ? a = b;

? ? ? ? return true;

? ? }

? ? return false;

}

看看AtomicInteger如何實(shí)現(xiàn)并發(fā)下的累加操作

假設(shè)線程A和線程B同時(shí)執(zhí)行g(shù)etAndAdd操作(分別跑在不同CPU上):

1. AtomicInteger里面的value原始值為3嚎京,即主內(nèi)存中AtomicInteger的value為3嗡贺,根據(jù)Java內(nèi)存模型,線程A和線程B各自持有一份value的副本鞍帝,值為3诫睬。

2. 線程A通過getIntVolatile(var1, var2)拿到value值3,這時(shí)線程A被掛起帕涌。

3. 線程B也通過getIntVolatile(var1, var2)方法獲取到value值3摄凡,運(yùn)氣好,線程B沒有被掛起蚓曼,并執(zhí)行compareAndSwapInt方法比較內(nèi)存值也為3亲澡,成功修改內(nèi)存值為2。

4. 這時(shí)線程A恢復(fù)纫版,執(zhí)行compareAndSwapInt方法比較床绪,發(fā)現(xiàn)自己手里的值(3)和內(nèi)存的值(2)不一致,說明該值已經(jīng)被其它線程提前修改過了,那只能重新來一遍了癞己。

5. 重新獲取value值膀斋,因?yàn)樽兞縱alue被volatile修飾,所以其它線程對它的修改痹雅,線程A總是能夠看到仰担,線程A繼續(xù)執(zhí)行compareAndSwapInt進(jìn)行比較替換,直到成功练慕。

intel手冊對lock前綴的說明如下:

1. 確保后續(xù)指令執(zhí)行的原子性惰匙。

在Pentium及之前的處理器中,帶有l(wèi)ock前綴的指令在執(zhí)行期間會(huì)鎖住總線铃将,使得其它處理器暫時(shí)無法通過總線訪問內(nèi)存,很顯然哑梳,這個(gè)開銷很大劲阎。在新的處理器中,Intel使用緩存鎖定來保證指令執(zhí)行的原子性鸠真,緩存鎖定將大大降低lock前綴指令的執(zhí)行開銷悯仙。

2. 禁止該指令與前面和后面的讀寫指令重排序。

3. 把寫緩沖區(qū)的所有數(shù)據(jù)刷新到內(nèi)存中吠卷。

上面的第2點(diǎn)和第3點(diǎn)所具有? ? 的內(nèi)存屏障效果锡垄,保證了CAS同時(shí)具有volatile讀和volatile寫的內(nèi)存語義。

CAS缺點(diǎn)

CAS存在一個(gè)很明顯的問題祭隔,即ABA問題货岭。

問題:如果變量V初次讀取的時(shí)候是A,并且在準(zhǔn)備賦值的時(shí)候檢查到它仍然是A疾渴,那能說明它的值沒有被其他線程修改過了嗎千贯?

如果在這段期間曾經(jīng)被改成B,然后又改回A搞坝,那CAS操作就會(huì)誤認(rèn)為它從來沒有被修改過搔谴。針對這種情況,java并發(fā)包中提供了一個(gè)帶有標(biāo)記的原子引用類AtomicStampedReference桩撮,它可以通過控制變量值的版本來保證CAS的正確性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敦第,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子店量,更是在濱河造成了極大的恐慌芜果,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫桂,死亡現(xiàn)場離奇詭異师幕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門霹粥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灭将,“玉大人,你說我怎么就攤上這事后控∶硎铮” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵浩淘,是天一觀的道長捌朴。 經(jīng)常有香客問我,道長张抄,這世上最難降的妖魔是什么砂蔽? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮署惯,結(jié)果婚禮上左驾,老公的妹妹穿的比我還像新娘。我一直安慰自己极谊,他們只是感情好诡右,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轻猖,像睡著了一般帆吻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咙边,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天猜煮,我揣著相機(jī)與錄音,去河邊找鬼样眠。 笑死友瘤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的檐束。 我是一名探鬼主播辫秧,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼被丧!你這毒婦竟也來了盟戏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤甥桂,失蹤者是張志新(化名)和其女友劉穎柿究,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黄选,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝇摸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年婶肩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片貌夕。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡律歼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啡专,到底是詐尸還是另有隱情险毁,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布们童,位于F島的核電站畔况,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慧库。R本人自食惡果不足惜跷跪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齐板。 院中可真熱鬧域庇,春花似錦、人聲如沸覆积。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宽档。三九已至,卻和暖如春庵朝,著一層夾襖步出監(jiān)牢的瞬間吗冤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工九府, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椎瘟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓侄旬,卻偏偏與公主長得像肺蔚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子儡羔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • Java8張圖 11宣羊、字符串不變性 12、equals()方法汰蜘、hashCode()方法的區(qū)別 13仇冯、...
    Miley_MOJIE閱讀 3,693評論 0 11
  • 在并發(fā)的情況下,Java主要靠synchronized和lock來保證同步族操,已解決多線程下的線程不安全問題苛坚,鎖雖然...
    激情的狼王閱讀 2,427評論 3 11
  • 轉(zhuǎn)載:并發(fā)-CAS原則 1.java內(nèi)存模型圖: 每個(gè)線程單獨(dú)有一份來自內(nèi)存的變量拷貝,彼此之間的操作是不可見的。...
    小小少年Boy閱讀 1,817評論 0 1
  • 本文首發(fā):WindCoder 什么是CAS泼舱? 全稱:Compare And Swap等缀,翻譯為比較并替換。 CAS機(jī)...
    蜜汁炒酸奶閱讀 757評論 0 1
  • 前言 CAS(compare and swap, 比較并交換)柠掂,是原子操作的一種项滑,可用于在多線程編程中實(shí)現(xiàn)不被打斷...
    草捏子閱讀 1,987評論 0 4