Java并發(fā)工具包
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)度器亡呵。
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ā)容器詳解、及使用場景
Java常用的并發(fā)工具類
1.CountDownLatch
1)功能
CountDownLatch是一個同步的輔助類琢感,允許一個或多個線程丢间,等待其他一組線程完成操作,再繼續(xù)執(zhí)行驹针。
2)原理:
-
CountDownLatch是通過一個計(jì)數(shù)器來實(shí)現(xiàn)的烘挫,計(jì)數(shù)器的初始值為需要等待線程的數(shù)量。
- 主線程調(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)示意圖:
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)示意圖:
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ù)量赊舶。
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ā)布梯皿!