java多線程同步器


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM