Java CountDownLatch CyclicBarrier 高並發技術簡單使用

CountDownLatch

CountDownLatch可看作是一個同步工具類,它允許一個或多個線程一直等待,直到其他線程的操作執行完後再執行 。例如,應用程序的主線程希望在負責啟動框架服務的線程已經啟動所有的框架服務之後再執行。

假如有:main線程 A、B、C、D、E 5個線程,模擬五個學生跑步,跑步完成後統計跑步成績。

測試類outLine效果如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

具體如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

學生具體的跑步實現如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

ps:main線程調用await方法暫時中斷(調用此方法後CountDownLatch的計數器減為0時會繼續執行),A/B/C/D/E5個線程調用countDown方法讓CountDownLatch的計數器減1。以此來達到讓A/B/C/D/E五個線程都執行完後main線程才能執行的目的。

執行結果如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

不足之處:看打印結果可發現5個學生沒有同時起跑,即沒有實現線程同步執行的場景,要實現此場景可藉助CyclicBarrier來實現。

CyclicBarrier

CyclicBarrier字面意思迴環柵欄 通過它可以實現讓一組線程等待至某個狀態(barrier狀態)之後再全部同時執行。

我們改動main方法如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

重新運行程序,結果如下:

Java CountDownLatch CyclicBarrier 高併發技術簡單使用

至此,已實現5個線程同步執行的場景。

Semaphore

翻譯成字面意思為 信號量,Semaphore可以控同時訪問的線程個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。


分享到:


相關文章: