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時,就表示所有的執行緒都已經...