CountDownLatch脆诉、Semaphore等4大并發(fā)工具類詳解

Java并發(fā)工具包

file
1.并發(fā)工具類

提供了比synchronized更加高級的各種同步結(jié)構(gòu):包括CountDownLatch、CyclicBarrier贷币、Semaphore等击胜,可以實(shí)現(xiàn)更加豐富的多線程操作。

2.并發(fā)容器

提供各種線程安全的容器:最常見的ConcurrentHashMap役纹、有序的ConcurrentSkipListMap,實(shí)現(xiàn)線程安全的動態(tài)數(shù)組CopyOnWriteArrayList等偶摔。

3.并發(fā)隊(duì)列

各種BlockingQueue的實(shí)現(xiàn):常用的ArrayBlockingQueue、SynchorousQueue或針對特定場景的PriorityBlockingQueue促脉。

4.Executor框架

可以創(chuàng)建各種不同類型的線程池辰斋,調(diào)度任務(wù)運(yùn)行等信不,絕大部分情況下,不再需要自己從頭實(shí)現(xiàn)線程池和任務(wù)調(diào)度器亡呵。

file

Java常用的并發(fā)容器

1.ConcurrentHashMap

經(jīng)常使用的并發(fā)容器,JDK 1.7和1.8的底層數(shù)據(jù)結(jié)構(gòu)發(fā)生了變化(后續(xù)文章會詳解)硫戈,這里可以建議學(xué)習(xí)順序如下:從Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap锰什,這樣可以更好的掌握這個并發(fā)容器,畢竟都是從HashMap進(jìn)化而來丁逝。

2.ConcurrentSkipListMap

在乎順序汁胆,需要對數(shù)據(jù)進(jìn)行非常頻繁的修改

3.CopyOnWrite容器

CopyOnWrite容器即寫時復(fù)制的容器。從JDK1.5開始Java并發(fā)包里提供了兩個使用CopyOnWrite機(jī)制實(shí)現(xiàn)的并發(fā)容器,CopyOnWriteArrayList和CopyOnWriteArraySet霜幼。

4.各種并發(fā)隊(duì)列的實(shí)現(xiàn)

如各種BlockedQueue實(shí)現(xiàn)嫩码,比較典型的ArrayBlockingQueue、SynchorousQueue罪既。

詳情請看:并發(fā)容器的原理铸题,7大并發(fā)容器詳解、及使用場景

file

Java常用的并發(fā)工具類

file
1.CountDownLatch

1)功能

CountDownLatch是一個同步的輔助類琢感,允許一個或多個線程丢间,等待其他一組線程完成操作,再繼續(xù)執(zhí)行驹针。

2)原理:

  • CountDownLatch是通過一個計(jì)數(shù)器來實(shí)現(xiàn)的烘挫,計(jì)數(shù)器的初始值為需要等待線程的數(shù)量。


    file
  • 主線程調(diào)用CountDownLatch的await()方法會阻塞當(dāng)前線程(即:主線程在閉鎖上等待)柬甥,直到計(jì)數(shù)器的值為0饮六。
  • 當(dāng)一個工作線程完成了自己的任務(wù)后,調(diào)用CountDownLatch的countDown()方法苛蒲,計(jì)數(shù)器的值就會減1卤橄。
  • 當(dāng)計(jì)數(shù)器值為0時,說明所有的工作線程都執(zhí)行完了撤防,此時虽风,在閉鎖上等待的主線程就可以恢復(fù)執(zhí)行任務(wù)。

3)應(yīng)用場景

倒數(shù)計(jì)時器

例如:一種典型的場景就是火箭發(fā)射寄月。在火箭發(fā)射前辜膝,為了保證萬無一失,往往還要進(jìn)行各項(xiàng)設(shè)備漾肮、儀器的檢查厂抖。 只有等所有檢查完畢后,引擎才能點(diǎn)火克懊。這種場景就非常適合使用CountDownLatch忱辅。

它可以使得點(diǎn)火線程七蜘,等待所有檢查線程全部完工后,再執(zhí)行

4)使用方式

static final CountDownLatch end = new CountDownLatch(10);
end.countDown();
end.await();

5)示意圖:

file
2.CyclicBarrier

1)功能:

CyclicBarrier的字面意思是可循環(huán)使用(Cyclic)的屏障(Barrier)墙懂。它要做的事情是橡卤,讓一組線程到達(dá)一個屏障(也可以叫同步點(diǎn))時被阻塞,直到最后一個線程到達(dá)屏障時损搬,屏障才會開門碧库,所有被屏障攔截的線程才會繼續(xù)運(yùn)行。

和CountDownLatch相似巧勤,也是等待某些線程都做完以后再執(zhí)行嵌灰。

2)與CountDownLatch區(qū)別

在于這個計(jì)數(shù)器可以反復(fù)使用。比如颅悉,假設(shè)我們將計(jì)數(shù)器設(shè)置為10沽瞭。那么湊齊第一批1 0個線程后,計(jì)數(shù)器就會歸零剩瓶,然后接著湊齊下一批10個線程驹溃。

3)原理

1)CyclicBarrier是通過一個計(jì)數(shù)器來實(shí)現(xiàn)的,計(jì)數(shù)器的初始值為需要等待線程的數(shù)量儒搭。eg:CyclicBarrier c = new CyclicBarrier(2); // 等待線程的數(shù)量為2

2)每個線程調(diào)用CyclicBarrier的await()方法吠架,使自己進(jìn)入等待狀態(tài)。

3)當(dāng)所有的線程都調(diào)用了CyclicBarrier的await()方法后搂鲫,所有的線程停止等待傍药,繼續(xù)運(yùn)行。

4)使用方式

public CyclicBarrier(int parties, Runnable barrierAction)
barrierAction就是當(dāng)計(jì)數(shù)器一次計(jì)數(shù)完成后魂仍,系統(tǒng)會執(zhí)行的動作
await()

5)示意圖:

file
3.信號量Semaphore

1)功能:Java提供了經(jīng)典信號量Semaphore的實(shí)現(xiàn)拐辽,它通過控制一定數(shù)量的許可(permit)的方式,來達(dá)到限制通用資源訪問的目的擦酌。例如:控制并發(fā)的線程數(shù)俱诸。

2)原理:

1)Semaphore是通過一個計(jì)數(shù)器(記錄許可證的數(shù)量)來實(shí)現(xiàn)的,計(jì)數(shù)器的初始值為需要等待線程的數(shù)量赊舶。

file

2)線程通過acquire()方法獲取許可證(計(jì)數(shù)器的值減1)睁搭,只有獲取到許可證才可以繼續(xù)執(zhí)行下去,否則阻塞當(dāng)前線程笼平。

3)線程通過release()方法歸還許可證(計(jì)數(shù)器的值加1)园骆。

說明:使用tryAcquire()方法可以立即得到執(zhí)行的結(jié)果:嘗試獲取一個許可證,若獲取成功寓调,則立即返回true锌唾,若獲取失敗,則立即返回false。

3)應(yīng)用場景:

Semaphore可以用于做流量控制晌涕,特別是公用資源有限的應(yīng)用場景滋捶,比如數(shù)據(jù)庫連接。

舉一個場景:例如在車站余黎、機(jī)場等出租車時重窟,當(dāng)很多空出租車就位時,為防止過度擁擠惧财,調(diào)度員指揮排隊(duì)等待坐車的隊(duì)伍一次進(jìn)來5個人上車亲族,等這5個人坐車出發(fā),再放進(jìn)去下一批可缚。這和Semaphore的工作原理有些類似。

4.交換者Exchanger

1)功能:Exchanger(交換者)是一個用于線程間協(xié)作的工具類斋枢。Exchanger用于進(jìn)行線程間的數(shù)據(jù)交換帘靡。它提供一個同步點(diǎn),在這個同步點(diǎn)兩個線程可以交換彼此的數(shù)據(jù)瓤帚。這兩個線程通過exchange方法交換數(shù)據(jù)描姚,
如果第一個線程先執(zhí)行exchange方法,它會一直等待第二個線程也執(zhí)行exchange戈次,當(dāng)兩個線程都到達(dá)同步點(diǎn)時轩勘,這兩個線程就可以交換數(shù)據(jù),將本線程生產(chǎn)出來的數(shù)據(jù)傳遞給對方怯邪。

2)原理:

線程A調(diào)用public V exchange(V dataA)方法绊寻,線程A到達(dá)同步點(diǎn),并且在線程B到達(dá)同步點(diǎn)前一直等待悬秉。

線程B調(diào)用public V exchange(V dataB)方法澄步,線程B到達(dá)同步點(diǎn)。

線程A與線程B都達(dá)到同步點(diǎn)時和泌,線程將自己的數(shù)據(jù)傳遞給對方村缸,兩個線程完成了數(shù)據(jù)的交換了。

3)Exchanger的應(yīng)用場景

Exchanger可以用于校對工作的場景武氓。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布梯皿!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市县恕,隨后出現(xiàn)的幾起案子东羹,更是在濱河造成了極大的恐慌,老刑警劉巖弱睦,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件百姓,死亡現(xiàn)場離奇詭異,居然都是意外死亡况木,警方通過查閱死者的電腦和手機(jī)垒拢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門旬迹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人求类,你說我怎么就攤上這事奔垦。” “怎么了尸疆?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵椿猎,是天一觀的道長。 經(jīng)常有香客問我寿弱,道長犯眠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任症革,我火速辦了婚禮筐咧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘噪矛。我一直安慰自己量蕊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布艇挨。 她就那樣靜靜地躺著残炮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缩滨。 梳的紋絲不亂的頭發(fā)上势就,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機(jī)與錄音脉漏,去河邊找鬼蛋勺。 笑死,一個胖子當(dāng)著我的面吹牛鸠删,可吹牛的內(nèi)容都是我干的抱完。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼刃泡,長吁一口氣:“原來是場噩夢啊……” “哼巧娱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烘贴,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤禁添,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桨踪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體老翘,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铺峭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墓怀。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卫键,靈堂內(nèi)的尸體忽然破棺而出傀履,到底是詐尸還是另有隱情,我是刑警寧澤莉炉,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布钓账,位于F島的核電站,受9級特大地震影響絮宁,放射性物質(zhì)發(fā)生泄漏梆暮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一绍昂、第九天 我趴在偏房一處隱蔽的房頂上張望惕蹄。 院中可真熱鬧,春花似錦治专、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棒旗,卻和暖如春喘批,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铣揉。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工饶深, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逛拱。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓敌厘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朽合。 傳聞我的和親對象是個殘疾皇子俱两,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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