5.1、多线程学习——闭锁的一个实现 CountDownLatch

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

闭锁

闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态。闭锁的作用相当于一扇门,在闭锁达到结束状态之前,这扇门一直是关闭的,并且没有任何线程可以通过,当达到结束状态时,这扇门会打开并允许所有的线程通过。
闭锁一旦成为结束状态将不可更改。

闭锁的适用场景
  • 确保某个计算所需的所有资源全部被初始化后才继续执行。
  • 确保某个服务在其依赖的服务都已经启动之后才启动。
  • 等待直到某个操作的所有参与者都就绪再继续执行。

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 并发编程实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值