JAVA爬虫三剑客,Java并发工具三剑客之CyclicBarrier源码解析

6303cf1ad72e4032bb135e726c2b99cd.png

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

属性

lock(ReentrantLock)它是用来给CyclicBarrier的操作加锁的trip(Condition)用来实现CyclicBarrier的wait和notify的parties(int)计数值,相当于CountDownLatch的countbarrierCommand(Runnable)当CyclicBarrier打开后,要执行的任务generation(Generation)CyclicBarrier的代,用来实现CyclicBarrier的重用count(int)值等于parties,每次有线程进入时,count值减一,减到0的时候CyclicBarrier打开,随后count值被reset为parties内部类

静态内部类Generation,该类的对象表示CyclicBarrier的当前代,Generation类有一个属性broken,用来表示当前屏障是否被损坏。

9fe6082bbde05565ec0bd4733877a467.png

构造方法

parties表示在CyclicBarrier被打开之前,需要有parties个线程执行await方法。

barrierAction表示CyclicBarrier被打开的时候需要执行的command,可以为null

8663b8bb8fe4b3395edea2a4265cdd19.png

方法

await

await方法调用了私有的dowait方法。

36ddf466def9eae8910b493e6f30cbb0.png

e2d53f88971ba792c559c3c5a29c670d.png

9b46df69e492856f9d151a750c408488.png

f98d0bad8846da3a600add2d5f327705.png

例子

CyclicBarrier源码中提供的使用示例

eaf93d8e77cd0269ed2b30e8228e3355.png

明天继续更新三剑客的最后一个:信号量 Semaphore,欢迎大家继续关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值