java執行緒併發工具類CyclicBarrier、CountDownLatch及Semaphore
一、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
&n