線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

一.概述

Java併發編程中涉及到很多輔助類,如CountDownLatch、CyclicBarrier、Semaphore和Lock。

二.CountDownLatch

CountDownLatch是一個同步工具類,它允許一個或多個線程一直等待,直到其他線程的操作執行完畢後再執行。

CountDownLatch是通過一個計數器實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1。當計數器的值為0的時候,就意味著所有的線程已經完成了任務,然後阻塞的線程就可以恢復並執行剩下的操作序列。

如下圖所示,啟動10個線程,CountDownLatch對象實例的計數器初始值也初始化為10。當每個線程都執行完自己的操作序列後,對CountDownLatch對象實例的計數器執行減1操作,直到計數器為0,await()方法才會恢復執行其操作序列剩下的任務。

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

執行結果

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

三.CyclicBarrier

CyclicBarrier是一個同步輔助類,它允許一組線程相互等待直到所有線程都到達一個公共的屏障點。

如下圖所示,啟動10個線程,當每個線程完成屬於自己的操作序列後,在執行共有的執行序列之前,可以調用await()方法執行阻塞等待,當所有的線程都阻塞等待,即已經達到公共屏障點,此時所有的線程可以繼續執行共有的操作序列。

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

執行結果

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

四.Semaphore

Semaphore(信號量)用於控制通知訪問特定資源的線程數量,協調各個線程並保證合理地使用公用線程。

舉個例子,商場有五個停車位,10個開小車的人先後來到商場,由於停車位有限,所以只能允許5個人先進入停車位,此時停車許可已用完,剩下的五個人只能等待,當一段時間後停車位空出3個的時候,說明此時多出了三個停車許可,等待的五個人就可以允許其中的三個人進入停車位,最後剩下的二人仍然需要等待已停車的人離開,多出至少2個停車位,他們才能進入。

如下圖所示Semaphore對象實例先初始化一個線程許可,即任何時候都只有一條線程在執行它的操作序列,而其他的線程只能等待,acquire()方法就是獲取線程許可,沒獲取到就會一直阻塞,release()方法是釋放線程許可。

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

執行結果

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

五.Lock

Lock加鎖的時候,其他線程會執行阻塞,直到獲取鎖的線程執行完其操作序列並釋放鎖,其他的線程才會競爭獲取鎖。

如下圖所示啟動100個線程,每次都只允許一個線程獲取到鎖並執行操作序列,而其他的線程則是出於阻塞狀態。

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

執行結果

線程CountDownLatch、CyclicBarrier、Semaphore、Lock詳解

您的關注是我的持續動力,咱們下期分享~bye


分享到:


相關文章: