Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)

Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)

1. CountDownLatch(線程計數器 )

CountDownLatch 類位於 java.util.concurrent 包下,利用它可以實現類似計數器的功能。比如有 一個任務 A,它要等待其他 4 個任務執行完畢之後才能執行,此時就可以利用 CountDownLatch 來實現這種功能了。

Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)

2. CyclicBarrier(迴環柵欄-等待至 barrier 狀態再全部同時執行)

字面意思迴環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。叫做迴環 是因為當所有等待線程都被釋放以後, CyclicBarrier 可以被重用。我們暫且把這個狀態就叫做 barrier,當調用 await()方法之後,線程就處於 barrier 了。

CyclicBarrier 中最重要的方法就是 await 方法,它有 2 個重載版本:

1). public int await():用來掛起當前線程,直至所有線程都到達 barrier 狀態再同時執行後續任 務;

2). public int await(long timeout, TimeUnit unit):讓這些線程等待至一定的時間,如果還有 線程沒有到達 barrier 狀態就直接讓到達 barrier 的線程執行後續任務。

具體使用如下,另外 CyclicBarrier 是可以重用的。


Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)


Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)

3. Semaphore(信號量-控制同時訪問的線程個數)

Semaphore 翻譯成字面意思為 信號量,Semaphore 可以控制同時訪問的線程個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。

Semaphore 類中比較重要的幾個方法:

1). public void acquire(): 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許 可。

2). public void acquire(int permits):獲取 permits 個許可

3). public void release() { } :釋放許可。注意,在釋放許可之前,必須先獲獲得許可。

4). public void release(int permits) { }:釋放 permits 個許可

上面 4 個方法都會被阻塞,如果想立即得到執行結果,可以使用下面幾個方法

1). public boolean tryAcquire():嘗試獲取一個許可,若獲取成功,則立即返回 true,若獲取失 敗,則立即返回 false

2). public boolean tryAcquire(long timeout, TimeUnit unit):嘗試獲取一個許可,若在指定的 時間內獲取成功,則立即返回 true,否則則立即返回 false

3). public boolean tryAcquire(int permits):嘗試獲取 permits 個許可,若獲取成功,則立即返 回 true,若獲取失敗,則立即返回 false

4). public boolean tryAcquire(int permits, long timeout, TimeUnit unit): 嘗試獲取 permits 個許可,若在指定的時間內獲取成功,則立即返回 true,否則則立即返回 false

5). 還可以通過 availablePermits()方法得到可用的許可數目。

例子:若一個工廠有 5 臺機器,但是有 8 個工人,一臺機器同時只能被一個工人使用,只有使用完 了,其他工人才能繼續使用。那麼我們就可以通過 Semaphore 來實現:


Java核心知識CyclicBarrier CountDownLatch Semaphore(二十五)

 CountDownLatch 和 CyclicBarrier 都能夠實現線程之間的等待,只不過它們側重點不 同;CountDownLatch 一般用於某個線程 A 等待若干個其他線程執行完任務之後,它才執行;而 CyclicBarrier 一般用於一組線程互相等待至某個狀態,然後這一組線程再同時 執行;另外,CountDownLatch 是不能夠重用的,而 CyclicBarrier 是可以重用的。

 Semaphore 其實和鎖有點類似,它一般用於控制對某組資源的訪問權限。


分享到:


相關文章: