CountDownLatch和CyclicBarrier的應(yīng)用場景

網(wǎng)上有很多文章都討論了CountDownLatch和CyclicBarrier的應(yīng)用場景崔梗,但是大部分CyclicBarrier的應(yīng)用場景都跟實際情況相去甚遠谅猾。

先來看看CountDownLatch:

CountDown 的意思是 倒計時昆汹,Latch 的意思是 門閂

JDK 釋中是這樣描述的:

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

  • 讓一個或多個線程持續(xù)等待锉罐,直到其他多線程執(zhí)行的一組操作全部完成以后能耻,這些等待的線程才會繼續(xù)執(zhí)行赏枚。

CountDownLatch的使用場景:

1. 讓單個線程等待多個線程

例如:一個服務(wù)需要從3個遠程接口獲取數(shù)據(jù),就可以開三個線程并調(diào)用遠程接口晓猛,等待所有遠程接口數(shù)據(jù)返回之后饿幅,服務(wù)線程再繼續(xù)執(zhí)行。
在比如:并發(fā)計算戒职,匯總結(jié)果栗恩。

2. 讓多個線程等待

例如:模擬秒殺場景,讓一組線程同時等待洪燥,同時恢復(fù)執(zhí)行磕秤,實現(xiàn)最大程度的并行性。

注意:當高并發(fā)請求時蚓曼,countdownlatch的await方法有可能會引起死鎖亲澡。

如果線程池中線程的數(shù)量較少,在高并發(fā)時會出現(xiàn)多個請求占用了全部的線程纫版,但是每個請求又需要await其他線程床绪,被等待的線程拿不到線程資源無法執(zhí)行,導(dǎo)致多個請求同時進入線程阻塞,最后形成死鎖癞己。

解決方法:使用自定義線程池膀斋,擴大線程數(shù)量,并且建立線程池拒絕機制痹雅。

再來看看 CyclicBarrier

Cyclic 的意思是 循環(huán) 仰担,Barrier 的意思是 屏障

JDK 注釋中是這樣描述的:

A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other.
The barrier is called cyclic because it can be re-used after the waiting threads are released.

  • CyclicBarrier 是一個同步輔助類绩社,它允許一組線程相互等待直到所有線程都到達一個公共的屏障點摔蓝。
  • 在程序中有固定數(shù)量的線程,這些線程有時候必須等待彼此愉耙,這種情況下贮尉,使用 CyclicBarrier 很有幫助。
  • 這個屏障之所以用循環(huán)修飾朴沿,是因為在所有的線程釋放彼此之后猜谚,這個屏障是可以重新使用的。

CyclicBarrier的應(yīng)用場景:

生活中我們會約朋友們到某個餐廳一起吃飯赌渣,有些朋友可能會早到魏铅,有些朋友可能會晚到,但是餐廳規(guī)定必須等到所有人到齊之后才會上菜坚芜。這里的朋友們就是各個線程览芳,餐廳就是 CyclicBarrier。

  • 這樣的例子有助于理解CyclicBarrier鸿竖,但我相信開發(fā)中一定不會遇到這樣的場景路操。

CyclicBarrier可以用于多線程計算數(shù)據(jù),最后合并計算結(jié)果的應(yīng)用場景千贯。比如現(xiàn)在需要計算10個人12個月的工資屯仗,可以開10個worker線程,分別計算每個人的工資搔谴,最后魁袜,再用barrierAction將這些線程的計算結(jié)果進行整合,得出最后結(jié)果敦第。

  • barrierAction不需要在主線程中執(zhí)行峰弹,這是CyclicBarrier的優(yōu)勢,但是其代價是阻塞了所有的worker線程芜果。
  • worker線程計算完成之后鞠呈,把結(jié)果保存就可以釋放線程了,用了CyclicBarrier把線程都阻塞了右钾,然后統(tǒng)一釋放蚁吝,這是什么設(shè)計旱爆?
CyclicBarrier強調(diào)線程之間相互等待

受經(jīng)驗所限,在實際開發(fā)中窘茁,我還沒有需要需要線程相互等待的例子怀伦,而且這樣的場景特別容易造成死鎖。

CyclicBarrier強調(diào)循環(huán)

多輪并行計算:如果需要計算N組人一年的平均工資山林,每組需要多個線程并行計算房待,計算完一組,再開始下一組驼抹,這樣就需要多輪并行計算桑孩。CyclicBarrier 比 CountDownLatch 更適合這樣的場景。

CountDownLatch與CyclicBarrier的區(qū)別:

  • CountDownLatch的計數(shù)器只能使用一次框冀。而CyclicBarrier的計數(shù)器可以使用reset() 方法重置
  • CyclicBarrier能處理更為復(fù)雜的業(yè)務(wù)場景洼怔,比如計算發(fā)生錯誤,可以結(jié)束阻塞左驾,重置計數(shù)器,重新執(zhí)行程序
  • CyclicBarrier還提供getNumberWaiting(可以獲得CyclicBarrier阻塞的線程數(shù)量)极谊、isBroken(用來知道阻塞的線程是否被中斷)等方法
  • CountDownLatch會阻塞主線程诡右,CyclicBarrier不會阻塞主線程,只會阻塞子線程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轻猖,一起剝皮案震驚了整個濱河市帆吻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咙边,老刑警劉巖猜煮,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異败许,居然都是意外死亡王带,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門市殷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愕撰,“玉大人,你說我怎么就攤上這事醋寝「阏酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵音羞,是天一觀的道長囱桨。 經(jīng)常有香客問我,道長嗅绰,這世上最難降的妖魔是什么舍肠? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任搀继,我火速辦了婚禮,結(jié)果婚禮上貌夕,老公的妹妹穿的比我還像新娘律歼。我一直安慰自己,他們只是感情好啡专,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布险毁。 她就那樣靜靜地躺著,像睡著了一般们童。 火紅的嫁衣襯著肌膚如雪畔况。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天慧库,我揣著相機與錄音跷跪,去河邊找鬼。 笑死齐板,一個胖子當著我的面吹牛吵瞻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甘磨,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼橡羞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了济舆?” 一聲冷哼從身側(cè)響起卿泽,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滋觉,沒想到半個月后签夭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡椎侠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年第租,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我纪。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡煌妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宣羊,到底是詐尸還是另有隱情璧诵,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布仇冯,位于F島的核電站之宿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苛坚。R本人自食惡果不足惜比被,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一色难、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧等缀,春花似錦枷莉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至噪裕,卻和暖如春蹲盘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膳音。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工召衔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭陷。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓苍凛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兵志。 傳聞我的和親對象是個殘疾皇子醇蝴,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355