闭锁CountDownLatch的源码实现介绍
首先,我们先来了解下闭锁的知识。闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用就相当于一扇门,在闭锁到达结束状态之前,这门一直是关闭的,并且没有任何线程可以通过,当到达结束状态时,这门打开并允许所有的线程通过,当闭锁到达结束状态之后,将不会改变闭锁的状态,一直保持着打开的状态,闭锁可以确保某些活动指导其他活动都完成后才继续执行。下面看一个具体的实现。
package com.nine.concurrent; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public long timeTasks(int nThreads,final Runnable task) { final CountDownLatch startGate = new CountDownLatch(1) ; final CountDownLatch enddGate = new CountDownLatch(nThreads); for(int i = 0;i<nThreads;i++){ Thread t = new Thread(){ @Override public void run() { try { startGate.await(); try{ task.run(); }finally{ enddGate.countDown(); } } catch (InterruptedException e) { e.printStackTrace(); } } }; t.start(); } long start = System.nanoTime(); startGate.countDown(); try { enddGate.await(); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.nanoTime(); return end-start; } }
这个demo中,使用了闭锁,而不是在线程创建后就立即启动,启动门,startGate使得主线程能够同时释放所有的工作线程,而结束门,可以使主线程能够能带最后一个线程执行完成,而不是顺序的等待每个线程执行完成。
下面来介绍下闭锁的具体实现:
所含方法: await(),await(long, TimeUnit),countDown,getCount
内部静态类Sync extends AbstractQueuedSynchronizer
1、两个公开方法,await和countDown,不存在获取资源的操作,在初始化的时候已经设置state。tryAcquireShared只是做检查操作,如果等于0,就返回1
countDown做releaseShared操作,它的实现是基于AQS的实现机制。下次重点解读下AQS的原理