AQS之countDownLatch原始碼解析

2021-10-06 20:05:48 字數 2485 閱讀 1323

public class countdownlatch 

int getcount(

) protected int tryacquireshared(int acquires)

protected boolean tryreleaseshared(int releases)}}

private final sync sync

; /**

* constructs a initialized with the given count.

** @param count the number of times

must be invoked

* before threads can pass through

* @throws illegalargumentexception if

is negative

*/public countdownlatch(int count)

}

自定義內部類 sync繼承自aqs,在其中實現了tryacquireshared,tryreleaseshared方法。

new countdownlatch(1)

;

首先進入構造方法

public countdownlatch(int count)

sync(int count)

可以看到,構造方法其實是將state設定為引數值。

使用await()方法

public void await(

) throws interruptedexception

呼叫aqs方法

public final void acquiresharedinterruptibly(int arg)

throws interruptedexception

從aqs再呼叫自定義實現中的tryaquireshare(arg)方法

countdownlatch.class

protected int tryacquireshared(int acquires)

很簡單,就是判斷state值是否為0。為0時則可以繼續執行業務流程。否則進入以下方法

private void doacquiresharedinterruptibly(int arg)

throws interruptedexception }if

(shouldparkafte***iledacquire(p, node)

&& parkandcheckinterrupt(

)) throw new interruptedexception();

}} finally

}

該方法將目前執行緒入隊,並判斷是否需要掛起。

countdown方法

public void countdown(

) protected boolean tryreleaseshared(int releases)

}

aqs.class

public final boolean releaseshared(int arg)

return

false

;}

通過呼叫子類tryreleaseshared方法,實現以下功能:將state值減一,如果等於0。將本節點置為頭節點,並通知啟用後繼節點。

這樣就實現了在countdown執行到state為0時,依次啟用了所有在佇列中的掛起執行緒。

public class countdownlatchtest 

@override

public void run(

)catch (interruptedexception e)}}

public static void main(string[

] args)

try catch (interruptedexception e)

}}

執行結果

thread sleep

done

thread sleep

done

thread sleep

done

thread sleep

done

thread sleep

done

main thread run

以上

java執行緒同步之CountDownLatch

1 類說明 jdk的concurrent包中的countdownlatch類是乙個執行緒同步的輔助類,它使得執行緒可以一直等待在其它執行緒中執行的操作,直到此操作結束。countdownlatch在初始化的時候指定乙個大小值n,呼叫countdownlatch的await方法的執行緒會陷入等待之中,...

ReentrantLock之AQS原理與原始碼詳解

abstractqueuedsynchronizer,抽象佇列同步器 給大家畫乙個圖先,看一下reentrantlock和aqs之間的關係。abstractqueuedsynchronizer為reentrantlock的靜態內部類 2 預設為非公平鎖 3 最終會呼叫abstractqueuedsy...

java併發程式設計之CountDownLatch

countdownlatch 主要是作用是用來維護乙個執行緒控制多個執行緒,內部是通過乙個計數器實現的,當我們建立乙個countdownlatch物件的時候,就需要指定乙個數值,這個數值就表示了執行緒的數量,每當乙個執行緒任務執行完畢,計數器就會減 1,當計數器的值變為0時,就表示所有的執行緒都已經...