1.CyclicBarrier的简单概述
CyclicBarrier是用于多线程相互等待到达一个公共的屏障点的同步工具类,如下图,小明,小宝,小周都需要等待其他人到达公共的屏障点后,才能继续做其他事,常用于多个线程需要一起完成的任务。本质是通过Lock,控制一个state状态,原子性的更新到0。
CyclicBarrier字面意思是“可重复使用的栅栏”,CyclicBarrier 相比 CountDownLatch 来说,要简单很多,其源码没有什么高深的地方,它是 ReentrantLock 和 Condition 的组合使用。
CyclicBarrier 和 CountDownLatch 是不是很像,只是 CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)。
2.CyclicBarrier使用的两种场景
1、n个线程准备好了一些数据,然后调用await方法,主线程等他们都处理好了,可以汇总n个线程准备好的数据。
2、n个线程等待都到齐了,再一个一个处理,await方法相当于签到,每个线程都调用await先签到,等到屏障数等于0,再处理后面的逻辑,最后签到的线程执行屏障并唤醒其它等待的线程。
3.CyclicBarrier与CountDownLatch区别
1、CyclicBarrier可以重置,而CountDownLatch不可以重置。
2、CountDownLatch是一个或多个线程等计数减少到0,一起开始做事。CyclicBarrier是最后一个线程,唤醒其它等计数器为0的线程,开始做事。
3、CyclicBarrier是基于独占锁ReentrantLock独占锁实现,CountDownLatch是基于共享锁实现。