CountDownLatch原始碼解析

2021-08-19 21:23:50 字數 2482 閱讀 7261

在看這篇部落格之前,建議大家將aqs原始碼理清楚再來看。當然,我之前的部落格中有寫aqs。若你將aqs沒搞懂,這裡看起來就不容易理解,不然你看countdownlatch的原始碼將很簡單

countdownlatch是通過乙個計數器來實現的,當我們在new 乙個countdownlatch物件的時候需要帶入該計數器值,該值就表示了執行緒的數量。每當乙個執行緒完成自己的任務後,計數器的值就會減1。當計數器的值變為0時,就表示所有的執行緒均已經完成了任務,然後就可以恢復等待的執行緒繼續執行了。

一、成員變數

private final sync sync

;

在countdownlatch原始碼中,只有乙個成員變數sync的物件,sync是countdownlatch的乙個內部類,這個類將是countdownlatch功能實現的核心。

private static final class sync extends abstractqueuedsynchronizer 

int

getcount()

protected int

tryacquireshared(int acquires)

protected boolean

tryreleaseshared(int releases)

}}

可見sync類繼承與aqs,並重寫了其中的兩個方法tryacquireshared和tryreleaseshared方法。就是獲取資源和釋放資源的方法。

1、構造方法    

sync(int count)

這個構造方法就是你在構造countdownlatch時傳入的引數,也就是計數器的值。

2、操作方法

tryacquireshared方法

這個很簡單,判斷計數器的值是否等於0,等於0返回1,否則返回-1。

tryreleaseshared

方法步驟如下

1、獲取計數器的值

2、如果計數器值為0,返回false

3、如果計數器值不為0,則使用cas操作將計數器值減1,如果cas操作成功,返回當前計數器值是否等於0。

二、操作方法

1、await方法

public void 

await() throws interruptedexception

public final void acquiresharedinterruptibly(int arg)

throws interruptedexception

await方法呼叫了aqs的acquiresharedinterruptly(1)方法,可以看到這個方法會執行我們重寫的tryacquireshared方法

我們重寫的方法就是計數器值為0返回true(說明所有執行緒都已完成任務),否則返回false(說明還有執行緒沒有完成任務)

2、帶計時器的await方法

public boolean 

await(long timeout, timeunit unit)

throws interruptedexception

這個方法和await方法一樣,唯一的區別就是這個方法有時間限制,當執行緒沒有在指定的時間內完成任務,await方法失效,所有執行緒都會通過await方法去執行未完的**。

3、countdown方法

public void 

countdown()

public final boolean 

releaseshared(int arg)

return false;

}

countdown方法呼叫了aqs的releaseshared方法。這個方法會呼叫我們重寫的tryreleaseshared方法。

重寫的tryrelease方法以死迴圈的方式來確認計數器的值,先將計數器減一。當計數器為0時,返回true,不然返回false。

三、countdownlatch的應用

public static void 

main(string args) throws interruptedexception

};thread t2 = new thread() catch (interruptedexception e)

system.out

.println("執行緒b

解析完成

");latch.countdown();

} };

t1.start();

t2.start();

latch.await();

system.out

.println("

所有執行緒都已經解析完成

");}

上述**有兩個執行緒去解析任務,只有當兩個執行緒都完成解析,主線程才能去解析。

我們建立了計數器值為2的countdownlatch。在主線程解析的前面呼叫await方法,在每個執行緒完成解析後呼叫countdown方法,這樣就可以達到我們所期望的要求。

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