前言
本篇将分析CyclicBarrier的源码,分析结束后,会用一个示例展示CyclicBarrier,并比较CyclicBarrier和CountDownLatch的区别。
1、CyclicBarrier的简介
CyclicBarrier允许一组线程在触发屏障之前相互等待,直到达到某一条件才继续执行;CyclicBarrier在这些线程释放后,又可以重新使用,所以也称循环栅栏。
2、分析源码
2.1、构造方法
1 | java复制代码//定义在触发屏障之前必须调用的线程数 |
2.2、await()方法
1 | java复制代码public int await() throws InterruptedException, BrokenBarrierException { |
3、CyclicBarrier与CountDownLatch的区别
- 两者都能实现阻塞一组线程,然后等待唤醒;
- 前者是最后一个线程到达直接唤醒,后者是调用countDown()方法;
- 前者是通过ReentrantLock的”独占锁”和Conditon来实现,后者是通过AQS的“共享锁”实现;
- 前者可以重复使用,后者只能使用一次;
- 前者只能实现多个线程到达后一起运行(多个条件成立才能一起运行);
- 后者不仅可以实现一个线程等待多个线程(多个条件成立才能一起运行),还能实现多个线程等待一个线程(多个条件成立并且等待某个特殊信号才能一起运行)
4、示例
1 | java复制代码public class CyclicBarrierTest { |
输出结果:
1 | java复制代码等待的条件是:条件0 |
结束语
本篇介绍了CyclicBarrier,分析了源码,用了一段代码演示了使用方法,并比较了CyclicBarrier和CountDownLatch的区别。
JUC锁篇章到此就分析完了,下一篇将开启分析JUC集合。
如果你觉得本篇文章对你有帮助的话,请帮忙点个赞,再加一个关注。
本文转载自: 掘金