1.8CountDownLatch史上最詳細(xì)源碼解析

前言

CountDownLatch是基于AQS實(shí)現(xiàn)的共享鎖慕淡,用await和countdown方法配合完成其它線程執(zhí)行完,再執(zhí)行阻塞的線程的功能虹蒋。所以這里一些AQS的知識(shí)就不過多的介紹氧秘,詳細(xì)見我的AQS篇章http://www.reibang.com/p/54d372425e54

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

public class CountDownLatch {
        private static final class Sync extends AbstractQueuedSynchronizer {
                    
        }
}

源碼解析

constructor
//構(gòu)造類点晴,實(shí)際上去創(chuàng)建繼承了AbstractQueuedSynchronizer 的Sync類
public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }
  • Sync
Sync(int count) {
            //設(shè)置狀態(tài)值,用來計(jì)數(shù)匾荆,當(dāng)?shù)扔?的時(shí)候可以釋放鎖
            setState(count);
        }
  • AQS的setState
protected final void setState(int newState) {
        state = newState;
    }
await(用來阻塞調(diào)用線程)
public void await() throws InterruptedException {
        //調(diào)用的是AQS的acquireSharedInterruptibly方法
        sync.acquireSharedInterruptibly(1);
    }
  • acquireSharedInterruptibly
    這個(gè)詳見我的AQS篇章拌蜘,我大概說下流程
    判斷是否是中斷標(biāo)志杆烁,是的話直接拋出異常結(jié)束方法了,這樣就取消了資源的獲取简卧,至于異常線程怎么處理咱們這就不用管啦兔魂。如果沒有獲得資源則進(jìn)入阻塞狀態(tài),當(dāng)被喚醒了举娩,是被中斷的狀態(tài)析校,則直接拋出異常結(jié)束自旋方法,當(dāng)然會(huì)進(jìn)入取消獲取節(jié)點(diǎn)階段铜涉,移除自身節(jié)點(diǎn)修改狀態(tài)智玻,并且喚醒下一個(gè)節(jié)點(diǎn)
//這個(gè)詳見我的AQS篇章
public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }
  • tryAcquireShared(CountDownLatch的Sync類對(duì)其進(jìn)行重寫了,只是判斷獲取的狀態(tài)計(jì)數(shù)值芙代,是0則表示獲得資源)
//在Sync類
//嘗試獲取資源(共享鎖)吊奢,當(dāng)狀態(tài)是0代表獲鎖成功
protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }
countDown(用來釋放相應(yīng)的線程)
//將計(jì)數(shù)狀態(tài)減一
public void countDown() {
        sync.releaseShared(1);
    }
  • releaseShared釋放資源(共享鎖)
//釋放資源(共享鎖) 
public final boolean releaseShared(int arg) {
        //嘗試獲取共享鎖,在CountDownLatch的內(nèi)部類進(jìn)行重寫
        if (tryReleaseShared(arg)) {
            //釋放資源,在AQS篇講過了就不做過多解釋了
            doReleaseShared();
            return true;
        }
        return false;
    }
  • tryReleaseShared嘗試獲取共享鎖,在CountDownLatch的內(nèi)部類進(jìn)行重寫
//嘗試獲取共享鎖,在CountDownLatch的內(nèi)部類進(jìn)行重寫
protected boolean tryReleaseShared(int releases) {
            //自旋直到狀態(tài)變?yōu)?链蕊,也就是構(gòu)造方法初始化的計(jì)數(shù)狀態(tài)值變?yōu)?后表示獲得鎖
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }

如果在理解了AQS的原理以后事甜,看CountDownLatch源碼其實(shí)沒啥東西。
AQS源碼見http://www.reibang.com/p/54d372425e54
覺得還不錯(cuò)的朋友可以點(diǎn)點(diǎn)贊哦L显稀B咔!陪蜻!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邦马,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宴卖,更是在濱河造成了極大的恐慌滋将,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件症昏,死亡現(xiàn)場(chǎng)離奇詭異随闽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肝谭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門掘宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攘烛,你說我怎么就攤上這事魏滚。” “怎么了坟漱?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵鼠次,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)腥寇,這世上最難降的妖魔是什么成翩? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮花颗,結(jié)果婚禮上捕传,老公的妹妹穿的比我還像新娘。我一直安慰自己扩劝,他們只是感情好庸论,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棒呛,像睡著了一般聂示。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簇秒,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天鱼喉,我揣著相機(jī)與錄音,去河邊找鬼趋观。 笑死扛禽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皱坛。 我是一名探鬼主播编曼,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剩辟!你這毒婦竟也來了掐场?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤贩猎,失蹤者是張志新(化名)和其女友劉穎熊户,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吭服,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚷堡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艇棕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦到。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欠肾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拟赊,我是刑警寧澤刺桃,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吸祟,受9級(jí)特大地震影響瑟慈,放射性物質(zhì)發(fā)生泄漏桃移。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一葛碧、第九天 我趴在偏房一處隱蔽的房頂上張望借杰。 院中可真熱鬧,春花似錦进泼、人聲如沸蔗衡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绞惦。三九已至,卻和暖如春洋措,著一層夾襖步出監(jiān)牢的瞬間济蝉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工菠发, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留王滤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓滓鸠,卻偏偏與公主長(zhǎng)得像雁乡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哥力,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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