CyclicBarrier、CountDownLatch與Semaphore的小記

qingyezhu發表於2016-04-15

CyclicBarrier:

適合的業務場景,比如

1)、,現有一大任務,需要得到全年的統計資料的,這個工作量是巨大的,那麼可以將其分割為12個月的子任務,各個子任務相互獨立,當所有子任務完成了,則就可以進行全年統計了,這樣大大提升了統計效率。

2)、大家一起去郊遊,由於大家住的地方比較分散,故需要一個集合點之後一起出發,這樣大家才能玩得開心嘛。

。。。。等等

就是當有一個大任務時,需要分配多個子任務去執行,只有當所有的子任務都執行完成後,才能執行主任務。

 

//阻塞等待
public int await()

 

CountDownLatch:

適合的業務場景,比如

1)、運動會中賽跑專案,之後所有的賽跑運動員準備好了,此時裁判才能宣佈該賽跑專案正式開始,裁判才能打出發信槍;當參與此次賽跑專案的所有的運動員都跑完了,此次賽跑專案才能算結束,才能統計出比賽名次。

。。。。等等

就是所有的準備好了,才能開始;或者是所有的都結束了,才能算結束。

 

//阻塞等待,直到計數器清零
public void await()

//阻塞等待,直到等待到最長時間,當等待時間超過設定時間時,計數器還沒有清零,則返回false,否則返回true
public boolean await(long timeout, TimeUnit unit)

//計數器減一,當計數器清零時,await的執行緒會被喚醒,執行緒繼續執行
public void countDown()

//獲取當前計數器的大小
public long getCount()

 

 

Semaphore:

適合的業務場景,比如

1)、當有10個人去上茅廁,但是隻有5個坑,即只能同時5個人使用,只有當一個人不使用坑了,另一個人才能使用該空閒的坑,一直維持著只能同時5個人使用。

2)、當停車場來了100輛車時,但是隻有30個停車位,即只能同時提供30個車輛停放,只有當一輛車開走了,另一輛車才能進入該空閒的停車位,一直維持著只能同時提供30個停車位。

。。。。等等

就是同時只能提供有限的,走一個才能進一個。

 

//申請獲取許可,當沒有剩餘的許可時,則被阻塞
public void acquire()

//釋放一個許可
public void release()

 

總結:

 

 CountDownLatch是等待一組執行緒執行完畢後才能繼續執行

 CyclicBarrier是能讓一組執行緒達到一個同步點時被阻塞,直到最後一個執行緒達到,阻塞才會消失,其是可以迴圈使用的

 Semaphore是隻允許一定數量的執行緒同時執行

 

相關文章