java基礎(chǔ):java CAS操作

什么是悲觀鎖锈玉、樂觀鎖?在java語言里义起,總有一些名詞看語義跟本不明白是啥玩意兒拉背,也就總有部分面試官拿著這樣的詞來忽悠面試者,以此來找優(yōu)越感默终,其實(shí)理解清楚了椅棺,這些詞也就唬不住人了犁罩。

  • synchronized是悲觀鎖,這種線程一旦得到鎖两疚,其他需要鎖的線程就掛起的情況就是悲觀鎖床估。
  • CAS操作的就是樂觀鎖,每次不加鎖而是假設(shè)沒有沖突而去完成某項(xiàng)操作诱渤,如果因?yàn)闆_突失敗就重試顷窒,直到成功為止。
那么問題來了源哩,什么是CAS操作鞋吉?

CAS是Compare-and-swap(比較與替換)的簡寫,是一種有名的無鎖算法励烦,在java中谓着,我們主要分析Unsafe類,因?yàn)樗械腃AS操作都是它來實(shí)現(xiàn)的坛掠,而在Unsafe類中這些方法也都是native方法

    public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

    public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

    public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

看到上面的解釋是不是索然無味赊锚,查找了很多資料也沒完全弄明白,通過幾次驗(yàn)證后屉栓,終于明白舷蒲,最終可以理解成一個(gè)無阻塞多線程爭搶資源的模型。先上代碼

package com.company.reentrantLock;

import java.util.concurrent.atomic.AtomicBoolean;
/**
 * Created by wxwall on 2017/6/2.
 */
public class AtomicBooleanTest implements Runnable{
    public static AtomicBoolean exits = new AtomicBoolean(true);
    public static void main(String[] args) {
        AtomicBooleanTest abd = new AtomicBooleanTest();
        Thread t1 = new Thread(abd);
        Thread t2 = new Thread(abd);
        t1.start();
        t2.start();
    }

    @Override
    public void run() {
        System.out.println("begin run");
        System.out.println("real " + exits.get());
        if(exits.compareAndSet(true,false)){
            System.out.println(Thread.currentThread().getName() + "  " + exits.get() );
            exits.set(true);
        }else{
            run();
        }
    }
}

輸出結(jié)果:

begin run
real true
Thread-1  false
begin run
real true
Thread-0  false

這里無論怎么運(yùn)行友多,Thread-1牲平、Thread-0都會(huì)執(zhí)行if=true條件,而且還不會(huì)產(chǎn)生線程臟讀臟寫域滥,這是如何做到的了纵柿,這就用到了我們的compareAndSet(boolean expect,boolean update)方法,先上圖簡單講解下程序原理启绰,然后再分析compareAndSet作用昂儒。

Paste_Image.png

這個(gè)圖中重最要的是compareAndSet(true,false)方法要拆開成compare(true)方法和Set(false)方法理解,是compare(true)是等于true后委可,就馬上設(shè)置共享內(nèi)存為false渊跋,這個(gè)時(shí)候,其它線程無論怎么走都無法走到只有得到共享內(nèi)存為true時(shí)的程序隔離方法區(qū)着倾。
但是這種得不到狀態(tài)為true時(shí)使用遞歸算法是很耗cpu資源的拾酝,所以一般情況下,都會(huì)有線程sleep屈呕。

總結(jié)

這篇文章并沒有展開講compareAndSet底層調(diào)用的是unsafe.compareAndSwapInt方法微宝,因?yàn)檫@是native方法,很多人都會(huì)展開找源碼虎眨,最后也只找到是調(diào)用CPU方法蟋软,沒講到具體用法镶摘,如果只用compareAndSet(true,false)舉例則更加簡單。
這種無阻塞式的多線程操作數(shù)據(jù)岳守,在大并發(fā)情況下凄敢,是一筆非常可觀的性能提升湿痢,所以涝缝,如果在大并發(fā)或多線程性能要求高的情況下有更加好的技術(shù)選型,可以參考這種底層實(shí)現(xiàn)譬重。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拒逮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臀规,更是在濱河造成了極大的恐慌滩援,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塔嬉,死亡現(xiàn)場離奇詭異玩徊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谨究,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門恩袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胶哲,你說我怎么就攤上這事畔塔。” “怎么了纪吮?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵俩檬,是天一觀的道長。 經(jīng)常有香客問我碾盟,道長,這世上最難降的妖魔是什么技竟? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任冰肴,我火速辦了婚禮,結(jié)果婚禮上榔组,老公的妹妹穿的比我還像新娘熙尉。我一直安慰自己,他們只是感情好搓扯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布检痰。 她就那樣靜靜地躺著,像睡著了一般锨推。 火紅的嫁衣襯著肌膚如雪铅歼。 梳的紋絲不亂的頭發(fā)上公壤,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音椎椰,去河邊找鬼厦幅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慨飘,可吹牛的內(nèi)容都是我干的确憨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓤的,長吁一口氣:“原來是場噩夢啊……” “哼休弃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起圈膏,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤玫芦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后本辐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥帆,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年慎皱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了老虫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茫多,死狀恐怖祈匙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情天揖,我是刑警寧澤夺欲,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站今膊,受9級(jí)特大地震影響些阅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斑唬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一市埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恕刘,春花似錦缤谎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至含蓉,卻和暖如春频敛,著一層夾襖步出監(jiān)牢的瞬間项郊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工姻政, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呆抑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓汁展,卻偏偏與公主長得像鹊碍,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子食绿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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