前言
体能状态先于精神状态,习惯先于决心,聚焦先于喜好。
闭锁
闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态。闭锁的作用相当于一扇门,在闭锁达到结束状态之前,这扇门一直是关闭的,并且没有任何线程可以通过,当达到结束状态时,这扇门会打开并允许所有的线程通过。
闭锁一旦成为结束状态将不可更改。
闭锁的适用场景
- 确保某个计算所需的所有资源全部被初始化后才继续执行。
- 确保某个服务在其依赖的服务都已经启动之后才启动。
- 等待直到某个操作的所有参与者都就绪再继续执行。
CountDownLatch
CountDownLatch 属于同步工具类
从字面含义看就是 递减门闩,门闩就是闭锁,递减就是使用一个计数器,当计数器不为0时,则门闩是关闭的,当计数器不断减少到为0时,门闩打开,被门闩拦截的所有线程可以继续执行。
CountDownLatch 声明计数器大小
如下,声明一个计数器初始值为3的 CountDownLatch 对象
CountDownLatch countDownLatch=new CountDownLatch(3);
使用 CountDownLatch 对象阻塞线程
在线程中添加如下内容,线程就会阻塞,直到门闩打开。
countDownLatch.await();
门闩计数器递减方法
每调用一次下面的方法,计数器就减少1,直到为0 ,所有被门闩阻塞的线程继续运行
反之,如果计数器始终不为0 ,则所有线程就会一直阻止——除非线程中断操作,或者超时
countDownLatch.countDown();
场景
三个人需要坐船到一个小岛种树,需要等三个人都到了才能出发
代码
import java.util.concurrent.CountDownLatch;
/**
* 使用 CountDownLatch
* 场景:三个人需要坐船到一个小岛种树,需要等三个人都到了才能出发
* @author jie.wu
*
*/
public class CountDownLanchTest {
/**初始化 闭锁 CountDownLatch
* 计数为3
* */
private static CountDownLatch c=new CountDownLatch(3);
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<3;i++) {
Thread t=new Thread("人员"+i) {
@Override
public void run() {
try {
super.run();
System.out.println(Thread.currentThread().getName()+" 到码头了");
}finally {
c.countDown();
}
}
};
t.start();
}
//等到 c.countDown() 计数次数减为0,或者线程 interrupted
//可以在多个线程使用该标志,可以阻塞多个线程
c.await();
System.out.println("三个人都准备好了,出发");
}
}
结果
人员0 到码头了
人员1 到码头了
人员2 到码头了
三个人都准备好了,出发
参考资料
[1]、《Java 并发编程实战》