CountDownLatch
CountDownLatch
内部静态类Sync
- 继承自
AbstractQueuedSynchronizer - tryAcquireShared()
- tryReleaseShared()
- 当state != 0时,获取锁失败,线程阻塞
- 当state==0时,释放锁成功,唤醒线程
protectedinttryAcquireShared(intacquires){return(getState()==0)?1:-1;}protectedbooleantryReleaseShared(intreleases){// Decrement count; signal when transition to zerofor(;;){intc=getState();if(c==0)returnfalse;intnextc=c-1;if(compareAndSetState(c,nextc))returnnextc==0;}}主要方法
- await()
- countDown()
publicvoidawait()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}publicbooleanawait(longtimeout,TimeUnitunit)throwsInterruptedException{returnsync.tryAcquireSharedNanos(1,unit.toNanos(timeout));}publicvoidcountDown(){sync.releaseShared(1);}测试
Thread 0 started
countDown第1次完成
countDown第2次完成
countDown第3次完成
Thread 0 执行结束
privatestaticvoidtestCountDownLatch()throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(3);ExecutorServiceexecutor=null;try{executor=Executors.newFixedThreadPool(1);for(inti=0;i<1;i++){intfinalI=i;executor.submit(()->{try{System.out.println("Thread "+finalI+" started");latch.await();System.out.println("Thread "+finalI+" 执行结束");}catch(InterruptedExceptione){thrownewRuntimeException(e);}});}for(inti=0;i<3;i++){TimeUnit.SECONDS.sleep(1);latch.countDown();System.out.println("countDown第"+(i+1)+"次完成");TimeUnit.SECONDS.sleep(1);}}finally{if(executor!=null){executor.shutdown();}}}