1、CyclicBarrier (原文連接:http://www.studyshare.cn/blog-front/blog/index )java
一、定義sql
CyclicBarrier是線程併發工具類之一,俗稱柵欄。當一組線程所有執行完後,到達柵欄屏障,就放開屏障,繼續日後執行。舉個簡單例子:幾個家庭約數據庫
定一個地點集合去郊遊,只有當全部家庭都到達後再商量下一步計劃,只要有一個沒到,先到達的家庭都必須等待。多線程
二、示例demo併發
實現:用5個子線程去執行任務,當任務執行完成後,交出本身的執行結果,再被統一釋放(開放柵欄)去作本身的事情,而以前5個子線程交出的結果函數
被另一個線程使用作其餘工做。高併發
代碼以下:工具
三、執行結果:測試
2、CountDownLatchui
一、定義
CountDownLatch是線程併發工具類,該類具備一個計數器,計數器具備一個初始化的值,當主線程調用latch.await()方法則進行阻塞,調用
latch.countDown()方法時計數器值減一,一直等到計數器的值減爲0的時候,原來阻塞的方法繼續往下執行。代碼以下:
(1)、定義兩個線程,線程一調用一次countDown(),線程二調用兩次countDown()
(2)、主線程代碼以下
(3)運行結果
二、使用場景
(1)、使用CountDownLatch編寫高併發測試程序,可使用CountDownLatch初始化100或者更多線程,當全部線程初始化完畢後
一塊兒去調用須要測試的業務模塊代碼,以此來模擬實際場景的高併發訪問,測試業務代碼對高併發的支持極限。
(2)、某些系統啓動以前須要作不少初始化工做,只有當初始化工做線程中的全部代碼執行完畢後,才繼續執行主線程代碼,此時
使用CountDownLatch來實現。
三、實現原理
CountDownLatch是基於AQS(AbstractQueuedSynchronizer (抽象隊列同步器))實現的,關於AQS在另一篇文章有詳細講解,包
括對源碼進行了深刻分析,請參考:http://www.studyshare.cn/blog-front//blog/details/1131/0
3、Semaphore
一、定義:
Semaphore:即信號量,它管理着一組虛擬的許可,許可的初始數量可經過構造函數指定,在執行操做時先獲取許可(只要還有剩餘的
許可),並在使用後釋放許可,若是沒有許可,則acquire方法會阻塞直到有許可。它提供的release()方法將返回一個許可給信號量。
二、關鍵方法
aquire():獲取一個虛擬許可,若是Semaphore中還有剩餘許可,則返回,不然此方法會阻塞,直到Semaphore中有許可爲止。
release():釋放一個虛擬許可回Semaphore中
三、使用場景
使用Semaphore實現一個數據庫鏈接池。demo源碼下載
(1)首先定義一個數據庫鏈接實現類,實現java.sql.Connection接口,以下
說明:java.sql.Connection實現方法不少,已省略。可下載demo源碼查看
(2)使用Semaphore實現數據庫鏈接池,代碼以下:
(3)、運行驗證結果分析
原創文章,轉載請註明來源:http://www.studyshare.cn/blog-front/blog/details/1157/0,