CountDownLatch分析
2831 ワード
1.クラス宣言
最も簡単で最も簡単な同期ツールクラスです.のハハハ
2.コア実行は依然としてSync内部クラスに依存する(基本的にすべてのツールクラス、ロックを含めてこのモードで実現される)
3.コンストラクタ
4.awaitメソッド
AQSにおけるacquireSharedInterruptiblyメソッド
5.countDownメソッド
AQSのreleaseSharedソース
最も簡単で最も簡単な同期ツールクラスです.のハハハ
// ,
public class CountDownLatch {
}
2.コア実行は依然としてSync内部クラスに依存する(基本的にすべてのツールクラス、ロックを含めてこのモードで実現される)
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
// AQS
setState(count);
}
int getCount() {
return getState();
}
// , 0
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
// , ,int releases AQS , , Countdown , 。
protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) { // CAS 。
int c = getState();
if (c == 0) // 0 , false,AQS
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0; // 0 true, 0 false,AQS
}
}
}
3.コンストラクタ
public CountDownLatch(int count) {
// 0
if (count < 0) throw new IllegalArgumentException("count < 0");
// Sync
this.sync = new Sync(count);
}
4.awaitメソッド
public void await() throws InterruptedException {
// AQS ,
// Sync tryAcquireShared , getState 0 ,
// state 0,await 。
sync.acquireSharedInterruptibly(1);
}
//
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
AQSにおけるacquireSharedInterruptiblyメソッド
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (tryAcquireShared(arg) < 0) // (getState() == 0) ? 1 : -1; 0 state 0
doAcquireSharedInterruptibly(arg);
}
5.countDownメソッド
public void countDown() {
// AQS
sync.releaseShared(1);
}
AQSのreleaseSharedソース
public final boolean releaseShared(int arg) {
// 0 ,tryReleaseShared true, doReleaseShared await
// 5, 6 countDown, countDown
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}