CountDownLatch原始碼閱讀

2021-09-27 09:22:37 字數 1864 閱讀 9683

countdownlatch是juc中的乙個併發工具類,主要作用是阻塞某執行緒至其他執行緒完成後,再呼叫本執行緒。類似於thread.join()

countdownlatch countdownlatch=new countdownlatch(3);//在構造時傳入需要等待的執行緒數

new thread(()->,"t1").start();

new thread(()->,"t2").start();

new thread(()->,"t3").start();

try catch (interruptedexception e)

system.out.println("所有執行緒執行完畢")

###########

執行結果是:

t1-執行中

t1-執行完畢

t2-執行中

t2-執行完畢

t3-執行中

t3-執行完畢

所有執行緒執行完畢

勢必主線程呼叫會等待其餘執行緒執行完畢。

下來對countdownlatch中主要兩方法進行閱讀分析。

public void await() throws interruptedexception 

public final void acquiresharedinterruptibly(int arg)

throws interruptedexception

protected int tryacquireshared(int acquires)

private void doacquiresharedinterruptibly(int arg)

throws interruptedexception

}//阻塞執行緒

if (shouldparkafte***iledacquire(p, node) &&

parkandcheckinterrupt())

throw new interruptedexception();

}} finally

}private node addwaiter(node mode)

}enq(node);

return node;

}private void setheadandpropagate(node node, int propagate)

}

總結:

有執行緒呼叫await方法,由於state還不是0,會加入到aqs中進行阻塞,直到其他執行緒呼叫.countdown()將state遞減至0,該執行緒才會進行喚醒進行鎖爭搶。

public void countdown() 

public final boolean releaseshared(int arg)

return false;

}//更新state,當state==0時,呼叫doreleaseshared();

protected boolean tryreleaseshared(int releases)

}private void doreleaseshared()

else if (ws == 0 &&

!compareandsetwaitstatus(h, 0, node.propagate)) //更改status為propagate

continue; // 迴圈cas

}if (h == head) // 如果頭節點被更改則跳出

break;

}}

總結:實現邏輯簡單來說就是每次呼叫對 state進行-1 直到為0時候進行喚醒執行緒,進行await()阻塞之後的**邏輯。

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