classDriver { voidmain()throws InterruptedException { CountDownLatchstartSignal=newCountDownLatch(1); CountDownLatchdoneSignal=newCountDownLatch(N); for (inti=0; i < N; ++i) // create and start threads newThread(newWorker(startSignal, doneSignal)).start(); doSomethingElse(); // don't let run yet startSignal.countDown(); // let all threads proceed doSomethingElse(); doneSignal.await(); // wait for all to finish } }
/** * Synchronization control For CountDownLatch. * Uses AQS state to represent count. */ privatestaticfinalclassSyncextendsAbstractQueuedSynchronizer { privatestaticfinallongserialVersionUID=4982264981922014374L;
protectedbooleantryReleaseShared(int releases) { // Decrement count; signal when transition to zero for (;;) { intc= getState(); if (c == 0) returnfalse; intnextc= c - 1; if (compareAndSetState(c, nextc)) return nextc == 0; } } }
首先,初始化时传递的Count值,复用AQS中的状态State.
实现了AQS的共享模式加锁及共享模式解锁.
tryAcquireShared(int acquires)
共享模式的加锁,锁空闲就返回1. 锁非空闲就返回-1.
tryReleaseShared(int releases)
共享模式的解锁.
1 2 3 4 5 6 7 8 9 10 11 12
protectedbooleantryReleaseShared(int releases) { // Decrement count; signal when transition to zero for (;;) { intc= getState(); if (c == 0) returnfalse; intnextc= c - 1; if (compareAndSetState(c, nextc)) return nextc == 0; } }