大家好,这里是淇妙小屋,一个分享技术,分享生活的博主1. CountDownLatch
以下是我的主页,各个主页同步更新优质博客,创作不易,还请大家点波关注
掘金主页
后续会发布更多MySQL,Redis,并发,JVM,分布式等面试热点知识,以及Java学习路线,面试重点,职业规划,面经等相关博客
转载请标明出处!
允许一个或多个线程等待其他线程完成操作
1.1 类图
文章图片
1.2 方法介绍
- public CountDownLatch(int count)
用于初始化state
- await()
如果state不为0,线程进入WATING状态(通过LockSupport),直到state变为0(可中断)
如果state为0,那么线程不会WATING
- countDown()
将state-1,如果state减为0——唤醒所有WATING线程
- await()
底层调用的是AQS共享锁加锁的那一套
Sync中实现了 tryAcquireShared(int acquires)——如果state为0,那么取得共享锁,如果state不为0,那么取得共享锁失败,后续会通过 LockSupport进入WATING状态
- countDown()
底层调用的是AQS释放共享锁的那一套
Sync中实现了 tryReleaseShared(int releases)——如果state为0,返回false,不会释放锁,如果state不为0,将state-1
如果state-1后为0,那么返回true,成功释放锁,唤醒所有WATING的线程
如果state-1后不为0,那么返回false,不会释放锁
当一组线程到达CyclicBarrier时被阻塞,直到最后一个线程到达屏障时,所有被阻塞的线程才能继续运行
(count初始值为parties,每当一个线程调用CyclicBarrier的await(),就会让count-1,如果count-1后不为0,那么线程进入WATING
如果count-1后为0,就会打破屏障唤醒所有WATING的线程)
2.1 类图
文章图片
2.2 构造方法
public CyclicBarrier(int parties) {
this(parties, null);
}//初始化parties,count,barrierCommand
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
2.3 await() 可中断
【Java并发——CountDownLatch和CycliBarrier异同点详解】
文章图片
2.4 reset()
- 加锁
- 调用nextGeneration()
- 调用breakBarrier()
- 释放锁
- CountDownLatch依靠AQS实现,CyclicBarrier依靠Lock接口与Condition接口实现
- CountDownLatch只能使用一次,CyclicBarrier可以用reset()重置
推荐阅读
- Java并发——一文吃透线程池
- Java并发——通过ReentrantReadWriteLock理解AQS的独占模式和共享模式
- Java并发—通过ReentrantLock和Semaphore揭秘AQS独占模式和共享模式
- 一文吃透JVM,面试轻松拿offer
- 网传的Spring大漏洞
- 《深入理解Java虚拟机》第3版学习笔记,涵盖全书精华,请查收!
- JAVA后端|Java日期处理
- java后端|spring boot使用druid多数据源配置
- MacOS新功能“通用控制”,多台设备操作互联太方便了!