1. 程式人生 > >java線程並發工具類CyclicBarrier、CountDownLatch及Semaphore

java線程並發工具類CyclicBarrier、CountDownLatch及Semaphore

www. 集合 工作 所有 分析 兩個 調用 支持 下一步

一、CyclicBarrier (原文鏈接:http://www.studyshare.cn/blog-front/blog/index )

1、定義

CyclicBarrier是線程並發工具類之一,俗稱柵欄。當一組線程全部執行完後,到達柵欄屏障,就放開屏障,繼續往後執行。舉個簡單例子:幾個家庭約

定一個地點集合去郊遊,只有當所有家庭都到達後再商量下一步計劃,只要有一個沒到,先到達的家庭都必須等待。

2、示例demo

實現:用5個子線程去執行任務,當任務執行完成後,交出自己的執行結果,再被統一釋放(開放柵欄)去做自己的事情,而之前5個子線程交出的結果

被另外一個線程使用做其他工作。

代碼如下:

技術分享圖片技術分享圖片

3、執行結果:

技術分享圖片

二、CountDownLatch

1、定義

CountDownLatch是線程並發工具類,該類具有一個計數器,計數器具有一個初始化的值,當主線程調用latch.await()方法則進行阻塞,調用

latch.countDown()方法時計數器值減一,一直等到計數器的值減為0的時候,原來阻塞的方法繼續往下執行。代碼如下:

(1)、定義兩個線程,線程一調用一次countDown(),線程二調用兩次countDown()

技術分享圖片

(2)、主線程代碼如下

技術分享圖片

(3)運行結果

技術分享圖片

2、使用場景

(1)、使用CountDownLatch編寫高並發測試程序,可以使用CountDownLatch初始化100或者更多線程,當所有線程初始化完畢後

一起去調用需要測試的業務模塊代碼,以此來模擬實際場景的高並發訪問,測試業務代碼對高並發的支持極限。

(2)、某些系統啟動之前需要做很多初始化工作,只有當初始化工作線程中的所有代碼執行完畢後,才繼續執行主線程代碼,此時

使用CountDownLatch來實現。

3、實現原理

CountDownLatch是基於AQS(AbstractQueuedSynchronizer (抽象隊列同步器))實現的,關於AQS在另外一篇文章有詳細講解,包

括對源碼進行了深入分析,請參考:http://www.studyshare.cn/blog-front//blog/details/1131/0

三、Semaphore

1、定義:

Semaphore:即信號量,它管理著一組虛擬的許可,許可的初始數量可通過構造函數指定,在執行操作時先獲取許可(只要還有剩余的

許可),並在使用後釋放許可,如果沒有許可,則acquire方法會阻塞直到有許可。它提供的release()方法將返回一個許可給信號量。

2、關鍵方法

aquire():獲取一個虛擬許可,如果Semaphore中還有剩余許可,則返回,否則此方法會阻塞,直到Semaphore中有許可為止。

release():釋放一個虛擬許可回Semaphore中

3、使用場景

使用Semaphore實現一個數據庫連接池。demo源碼下載

(1)首先定義一個數據庫連接實現類,實現java.sql.Connection接口,如下

技術分享圖片

說明:java.sql.Connection實現方法很多,已省略。可下載demo源碼查看

(2)使用Semaphore實現數據庫連接池,代碼如下:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

(3)、運行驗證結果分析

技術分享圖片

原創文章,轉載請註明來源:http://www.studyshare.cn/blog-front/blog/details/1157/0,

更多技術文章:http://www.studyshare.cn/blog-front//blog/index

java線程並發工具類CyclicBarrier、CountDownLatch及Semaphore