查看完整视频
评论可见

您需要在视频最下面评论,方可查看完整视频

积分观看

您支付积分,方可查看完整视频

{{user.role.value}}
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
专属视频

只允许以下等级用户查看该视频

升级
会员专享

CountDownLatch核心源码解析

之前我谈到过ReentrantLock是基于AQS的独占锁来实现的,今天主要来谈谈AQS的另外一种锁:共享锁的实现。

而CountDownLatch正式基于共享锁来实现的,重点会谈到以下几点:

  • CountDownLatch简介
  • CountDownLatch的核心成员
  • CountDownLatch的源码解析
  • CountDownLatch的应用场景
  • CountDownLatch的总结

CountDownLatch

CountDownLatch是java的JUC并发包里的一个工具类,可以理解为一个倒计时器,用于当某些任务执行完后,再执行其他任务的场景。

例如:老板开会,只有等所有人到齐了才能开会。

比如有一个主线程A(老板),它要等待其他4个子线程(员工)执行完成(到达会议室)之后才能执行(开会),此时就可以利用CountDownLatch来实现这种功能了。

CountDownLatch的实现原理

隐藏内容,您需要满足以下条件方可查看
End

课后作业

这是一道腾讯的面试题:

隐藏内容,您需要满足以下条件方可查看
End

请把你的答案写到问答区域,一课一练。(输出是最好的学习:每一次输出都会让你离目标更进一步)

3:并发工具

CountDownLatch实例源码

2020-7-14 17:30:05

6:并发其它

深入Atomic底层实现原理

2020-8-5 17:29:45

2 条回复 A文章作者 M管理员
  1. 1.CountDownLatch继承AQS,使用了AQS的共享锁模式。使用state作为计数器,CLH队列实现线程等待。在初始化CDL的时候会定义计数器的值,每次调用countDown()都会使state-1,当state==0的时候会唤醒所有的await()的线程。
    2.CDL的核心方法有:
    CDL(int count) 构造函数,在构造的时候设置state的初始值;
    countDown() 使state – 1,调用releaseShared(1);
    await() 获取锁,如果没有获取成功,则将当前线程包装成Node加入CLH队列尾部,然后进行自旋获取锁,直到成功,调用acquireSharedInterruptibly()。
    3.使用场景:
    1⃣️在一个方法里需要组装各个接口返回的数据,可以在每个线程里各自获取各自接口的数据,主线程await(),等主线程获取到锁以后,再进行数据的组装;
    2⃣️在测试时模拟并发请求,设置CDL(1),所有子线程全部await(),等所有子线程初始化完毕以后,主线程countDown()。

  2. 1、实现原理:
    CountDownLatch是用AQS实现的,使用AQS的state变量来存放计数器的值。在调用CountDownLatch的构造函数时,
    会调用内部类Sync的构造函数将值赋给state变量,当多个线程调用countdown方法时实际是使用CAS递减state变量的值;当线程调用await方法后当前线程会被放入AQS阻塞队列等待计数器为0时返回,即其他所有线程都调用了countdown方法时。最后,当计数器的值变为0时,当前线程还会调用AQS的doReleasedShared()方法激活调用await()方法而被阻塞的线程。
    2、核心方法:
    CountDownLatch构造方法(创建计数器)
    await(阻塞队列)
    countDown(计数器递减)
    3、使用场景:
    一个任务包含多个任务,主任务需要所有子任务全部完成之后才能开始运行。

个人中心
今日签到
搜索