# CountDownLatch

# 1. 简介

​ CountDownLatch是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值(count)由于countDown方法的调用达到0,count为0之后所有的等待线程都会被释放,并且随后对await方法的调用都会立即返回。

# 2. 使用

​ CountDownLatch有两种用法:

		1. 多等一:初始化count=1,多条线程await()阻塞,一条线程调用countDown()唤醒所有阻塞线程。
		2. 一等多:初始化count=n,多线程countDown()对count进行减一,一条线程await()阻塞,当count=0时阻塞的线程开始执行。

多等一示例:

public class CountDownLatchTest{
    public static viod mian(String[] args){
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        for (int i = 1; i <= 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println("线程:" + Thread.currentThread().getName()
                    + "....阻塞等待!");
                    countDownLatch.await();
                    // 可以在此处调用需要并发测试的方法或接口
                    System.out.println("线程:" + Thread.currentThread().getName()
                    + "....开始执行!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, "T" + i).start();
        }
        Thread.sleep(1000);
        countDownLatch.countDown();
    }
}

一等多示例:

public class CountDownLatchTest{
    public static viod mian(String[] args){
        final CountDownLatch countDownLatch = new CountDownLatch(3);
        Map data = new HashMap();
        for (int i = 1; i <= 3; i++) {
            final int page = i;
            new Thread(() -> {
                System.out.println("线程:" + Thread.currentThread().getName() +
                        "....读取分段数据:"+(page-1)*200+"-"+page*200+"行");
                // 数据加入结果集:data.put();
                countDownLatch.countDown();
            }, "T" + i).start();
        }
        countDownLatch.await();
        System.out.println("线程:" + Thread.currentThread().getName() 
                + "....对数据集:data进行处理");
    }
}

多等一使用场景:当我们要模拟并发时, 可以使用多等一,同时开始调用某个接口,

一等多使用场景:多个任务存在前后依赖关系,如对多个接口数据的聚合,多段读取数据后合并等。