Java之CountDownLatch原理解析

Java之CountDownLatch原理解析

1. demo展示

代码逻辑展示了主线程中创建2个子线程分别去执行任务,主线程等2个子线程执行完毕后,再接着执行下面的代码;
常用场景:

  • 分别计算,汇总结果。如,多个线程分别解析excel中的sheet,等待全部解析完毕后汇总结果;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class CountDownLatchDemo {
    //定义一个倒计时闩锁
    static CountDownLatch c = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            try {
                TimeUnit.MICROSECONDS.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是线程1");
            //释放一个
            c.countDown();
        }).start();

        new Thread(() -> {
            try {
                TimeUnit.MICROSECONDS.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是线程2");
            //释放一个
            c.countDown();
        }).start();

        System.out.println("我是主线程,我要等那两个线程执行完毕...");
        //等待倒计时为0
        c.await();
        System.out.println("我是主线程,那两个线程都执行完了");
    }
}

输出:

我是主线程,我要等那两个线程执行完毕...
我是线程2
我是线程1
我是主线程,那两个线程都执行完了

2. 原理解析

  1. 先看构造函数new CountDownLatch(2)做了什么?
    这是初始化了AQS子类,并将AQS的状态state设置为传入的2;
    public CountDownLatch(int count) {
          if (count < 0) throw new IllegalArgumentException("count < 0");
          this.sync = new Sync(count);
      }
    
  2. 看c.countDown()做了什么?
    它释放了一个共享锁状态,也就是state减1;
    public void countDown() {
         sync.releaseShared(1);
     }
    
  3. 再看c.await()做了什么?
    await方法是CounDownLatch中定义的,它调用了其内部类Sync(也是AQS的子类)的获取共享锁的方法acquireSharedInterruptibly;
    在这里插入图片描述
    acquireSharedInterruptibly方法中调用了CountDownLatch内部类Sync中实现的获取共享锁的方法tryAcquireShared,返回值不小0就算获取到了锁,await方法就能返回了,如果返回值小于0将会进入阻塞等待;
    在这里插入图片描述
    CountDownLatch内部类Sync中tryAcquireShared的实现很简单,只要state=0就返回1,否则返回-1;上面说了返回一个不小于0的数字,c.await()就相当于获取到了锁,就可以返回了,主线程就可以继续执行了。
    在这里插入图片描述
    通过上面分析,每次c.countDown(),就会将state减1,state=0的时候主线程恢复执行;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值