Java中多線程開發時,離不開線程的分工協作,常用的多線程的同步器有如下幾種:
1、CountDownLatch
應用場景:等待一組線程任務完成后在繼續執行當前線程。
用法:定義一個CountDownLatch變量latch,在當前線程中調用latch.await()方法,在要等待的一組線程中執行完后調用latch.countDown()方法,這樣當該做線程都調用過latch.countDown()方法后就開始執行當前線程latch.await()后的方法。
2、CyclicBarrier
應用場景:等待一組線程到達某個點后一起執行,該組線程達到指定點后可以再次循環執行。也可用於一組線程達達某個點后再執行某個方法。
用法:定義一個CyclicBarrier變量barrier,線程達到某個約定點時調用barrier.await()方法,當該組所有線程都調用了barrier.await()方法后改組線程一起向下執行。
CyclicBarrier和CountDownLatch的區別
- CountDownLatch的計數器只能使用一次。而CyclicBarrier的計數器可以使用reset() 方法重置。所以CyclicBarrier能處理更為復雜的業務場景,比如如果計算發生錯誤,可以重置計數器,並讓線程們重新執行一次。
- CyclicBarrier還提供其他有用的方法,比如getNumberWaiting方法可以獲得CyclicBarrier阻塞的線程數量。isBroken方法用來知道阻塞的線程是否被中斷。
3、Semaphore
應用場景:對於一組有限制都資源訪問。比如餐廳有5個位置但同時有7個人要吃飯,則要控制7個人對餐位的並發實用。
用法:定義Semaphore變量semaphore包含受限的資源個數,每個人要來用餐時先調用semaphore.acquire()方法獲取一個餐位(若沒有餐位,則阻塞等待),用完餐后調用semaphore.release()釋放餐位給其它人用。
4、阻塞隊列
應用場景:可用於實現簡單的生產者消費者模型。
用法:生產者線程put元素到隊列,若隊列滿則組賽到隊列有空間;消費者不斷從隊列take獲取元素,若隊列空則組賽道隊列有元素。
https://www.cnblogs.com/dolphin0520/p/3920397.html