大家好,这里是淇妙小屋,一个分享技术,分享生存的博主
以下是我的主页,各个主页同步更新优质博客,创作不易,还请大家点波关注
掘金主页
后续会公布更多MySQL,Redis,并发,JVM,分布式等面试热点常识,以及Java学习路线,面试重点,职业规划,面经等相干博客
转载请表明出处!
1. CountDownLatch
容许一个或多个线程期待其余线程实现操作
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线程
1.3 办法详解
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,不会开释锁
2. CyclicBarrier
当一组线程达到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()
可中断
2.4 reset()
- 加锁
- 调用nextGeneration()
- 调用breakBarrier()
- 开释锁
3. CountDownLatch与CyclicBarrier的区别
- CountDownLatch依附AQS实现,CyclicBarrier依附Lock接口与Condition接口实现
- CountDownLatch只能应用一次,CyclicBarrier能够用reset()重置