
CountDownLatch内部静态类Sync继承自AbstractQueuedSynchronizertryAcquireShared()tryReleaseShared()当state ! 0时获取锁失败线程阻塞当state0时释放锁成功唤醒线程protectedinttryAcquireShared(intacquires){return(getState()0)?1:-1;}protectedbooleantryReleaseShared(intreleases){// Decrement count; signal when transition to zerofor(;;){intcgetState();if(c0)returnfalse;intnextcc-1;if(compareAndSetState(c,nextc))returnnextc0;}}主要方法await()countDown()publicvoidawait()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}publicbooleanawait(longtimeout,TimeUnitunit)throwsInterruptedException{returnsync.tryAcquireSharedNanos(1,unit.toNanos(timeout));}publicvoidcountDown(){sync.releaseShared(1);}测试Thread 0 startedcountDown第1次完成countDown第2次完成countDown第3次完成Thread 0 执行结束privatestaticvoidtestCountDownLatch()throwsInterruptedException{CountDownLatchlatchnewCountDownLatch(3);ExecutorServiceexecutornull;try{executorExecutors.newFixedThreadPool(1);for(inti0;i1;i){intfinalIi;executor.submit(()-{try{System.out.println(Thread finalI started);latch.await();System.out.println(Thread finalI 执行结束);}catch(InterruptedExceptione){thrownewRuntimeException(e);}});}for(inti0;i3;i){TimeUnit.SECONDS.sleep(1);latch.countDown();System.out.println(countDown第(i1)次完成);TimeUnit.SECONDS.sleep(1);}}finally{if(executor!null){executor.shutdown();}}}