首先,我们先来了解下闭锁的知识。闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用就相当于一扇门,在闭锁到达结束状态之前,这门一直是关闭的,并且没有任何线程可以通过,当到达结束状态时,这门打开并允许所有的线程通过,当闭锁到达结束状态之后,将不会改变闭锁的状态,一直保持着打开的状态,闭锁可以确保某些活动指导其他活动都完成后才继续执行。下面看一个具体的实现。
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的原理
闭锁工具详解
本文介绍了闭锁工具类的概念及其在并发编程中的应用。通过具体示例展示了如何利用闭锁来同步多个线程的执行流程,确保某些任务在其他任务完成后再进行。
359

被折叠的 条评论
为什么被折叠?



