CountDownLatch分析

2831 ワード

1.クラス宣言
最も簡単で最も簡単な同期ツールクラスです.のハハハ
//      ,      
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;
    }