CyclicBarrier源码分析

CyclicBarrier源码解读

CyclicBarrier源码解析

Java并发工具三剑客之CyclicBarrier源码解析
首先CountDownLatch在await之后必须依靠别的线程来给它countDown,打开门闩;其次CountDownLatch在countDown到0之后,该CountDownLatch的生命周期就结束了,它不能重用。那么有没有既可以自己给自己打开门闩而且还能重用的呢,有的,那就是CyclicBarrier,译作回环栅栏。它的使用方法和CountDownLatch差不多,也有一个计数值,叫做parties。CyclicBarrier的使用通俗来说就是,有一个栅栏(CyclicBarrier),它必须由n(parties)个人才能被推到,推到之后这n个人(线程)才能出来,出来之后呢,再把这个栅栏重新立起来又可以用了(重用)。

CyclicBarrier源码分析
CyclicBarrier源码分析

CyclicBarrier原理
具体逻辑实现是
1 定义变量 lock , trip , generation , barrierCommand , parties,count 等等
2 通过构造函数获取必须同时到达barrier的线程个数(parties)和parties个线程到达barrier时,会执行的动作(barrierCommand)
3 如果未达到线程个数,则执行trip.await() 方法(即condition.await()),释放锁,等待被唤醒。count
4 如果达到线程个数,执行barrierCommand,trip.signalAll() 唤醒线程并更新generation,parties,count,意味着新的一轮计数开始。