下面我们来说一下java并发编程的工具类CountDownLatch。CountDownLatch也叫闭锁,在JDK1.5被引入,允许一个或多个线程等待其他线程完成操作后再执行。CountDownLactch内部维护了一个计数器,这个计数器的数量和线程数量一致,主线程执行await方法阻塞,每完成一个任务,计数器减1,直到计数器为0时,等待的主线程被唤醒继续执行。CountDownLatch有一个内部类Sync,这个类继承了AbstractQueuedSynchronizer,我们来看一下这个类
Sync(int count) {
setState(count);
}
int getCount() {
return getState();
}
看一下await方法
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
调用AbstractQueuedSynchronizer的acquireSharedInterruptibly方法
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
获取state的值,不等于0则阻塞线程并加入阻塞队列中,等于0则唤醒主线程继续执行。
再看一下countDown方法
public void countDown() {
sync.releaseShared(1);
}
调用AbstractQueuedSynchronizer的releaseShared方法
public final boolean releaseShared(int arg) {
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}
通过cas修改state的值,将state的值减1,成功则判断值是否为0,如果为0,则通过LockSupport的unpark方法唤醒当前线程继续执行。
CountDownLatch就介绍到这里了。
网友评论