CountDownLatch 原始碼解析

2021-08-18 02:52:03 字數 1639 閱讀 2906

countdownlatch 又稱為閉鎖,基於 aqs 實現,不熟悉 aqs 的同學可以查閱筆者關於 aqs 原始碼分析的文章進行學習。關於 countdownlatch 的使用我們就不過多贅述了,直接進入原始碼分析,我們首先來看一下 countdownlatch 的構造方法:

countdownlatch:

public

countdownlatch

(int count)

countdownlatch.sync:

sync

(int count)

看到這裡,我們應該大致猜到了 countdownlatch 的實現原理,通過遞減 aqs 的 state 值來實現閉鎖的控制。我們來驗證我們的猜想,首先來看 await 方法的實現:

countdownlatch:

public

void

await()

throws interruptedexception

await方法的實現很熟悉,我們在 aqs(abstractqueuedsynchronizer)原始碼解析(共享鎖)這篇文章中已經詳細分析過 acquiresharedinterruptibly 方法,是可以響應中斷的共享鎖獲取方法,方法中會呼叫由子類實現的 tryacquireshared 方法實現共享鎖獲取邏輯,我們來看 countdownlatch 對於 tryacquireshared 方法的實現:

countdownlatch.sync:

protected

inttryacquireshared

(int acquires)

我們分析過 tryacquireshared 方法的返回值,這裡當 aqs 的 state 為0時返回1,代表獲取鎖成功,不為0(大於0)時返回-1代表獲取鎖失敗,要進行阻塞等待。按照我們的猜想,countdown 方法應該是遞減 aqs 的 state 變數的值直到為0,然後喚醒呼叫 await 方法阻塞的執行緒。我們來看一下 countdown 方法的實現:

countdownlatch:

public

void

countdown()

這裡的 releaseshared 釋放共享鎖方法同樣來自於 aqs,方法中首先會呼叫由子類覆蓋的 tryreleaseshared 方法,通過嘗試設定 state 變數來釋放共享鎖,我們來看 countdownlatch 對於 tryreleaseshared 方法的實現:

countdownlatch.sync:

protected

boolean

tryreleaseshared

(int releases)

}

由此可見,我們的猜想是正確的。整體來看,countdownlatch 就是基於 aqs 的共享鎖實現,如果理解了 aqs 的共享鎖,理解 countdownlatch 的實現原理還是比較簡單的。

AQS之countDownLatch原始碼解析

public class countdownlatch int getcount protected int tryacquireshared int acquires protected boolean tryreleaseshared int releases private final syn...

多執行緒 CountDownLatch

countdownlatch 允許乙個或多個執行緒等待其他執行緒完成操作。應用場景 假如有這樣乙個需求,當我們需要解析乙個excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析乙個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中,要實現主線程...

執行緒同步 CountDownLatch

應用場景 有乙個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。假如我們這個想要繼續往下執行的任務呼叫乙個countdownlatch物件的await 方法,其他的任務執行完自己的任務後呼叫同乙個countdownlatch物件上的countdown 方法,這個呼叫await ...