CountDownLatch原始碼解析

2021-10-17 18:44:55 字數 1271 閱讀 3010

countdownlatch是基於aqs的實現,在學習之前必須先懂aqs共享鎖的原理。

內部類countdownlatch裡維護了乙個內部類sync繼承了aqs,這和reentrantlock系列類似,可以看出aqs的使用一般都是重寫兩組方法tryacquire/tryrelease以及tryacquireshared/tryreleaseshared

這兩組方法選一組實現就可以了

private

static

final

class

sync

extends

abstractqueuedsynchronizer

intgetcount()

// 只有在state減為零是才能競爭鎖成功

protected

inttryacquireshared

(int acquires)

//對於執行緒的countdown方法,實際上就是釋放共享鎖的過程

//cas自旋減1

protected

boolean

tryreleaseshared

(int releases)

}}

從上面可以知道,實際上countdownlatch就是使用的共享鎖,將countdownlatch呼叫者執行緒阻塞在佇列中(aqs),在構造器時將state置為傳進來的count數目,在各個執行緒執行了足夠數量的countdown後就可以喚醒阻塞的執行緒了。

public

countdownlatch

(int count)

await
//可以看出countdownlatch是支援超時功能的,呼叫的是aqs的tryacquiresharednanos方法

public

boolean

await

(long timeout, timeunit unit)

throws interruptedexception

這個方法在state不為0時(內部類的重寫),呼叫了會阻塞住當前執行緒。

countdown

countdown這個方法就是釋放鎖,共享執行緒就會減一,當為0時,才會去呼叫喚醒方法

public

void

countdown()

只要閱讀過aqs的原始碼,countdownlatch變得so easy

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 ...