面试官:CyclicBarrier有了解过吗?

网站建设3年前发布
43 0 0

20230305211051d3929f2906cc486c515639af5caf4cacb40671498,Java提供了一些非常好用的并发工具类,不需要我们重复造轮子,本节我们讲解CyclicBarrier,一起来看下吧~,这个跟我们上节讲的CountDownLatch有点类似,从字面意思讲是相当于一个可循环的屏障,他与CountDownLatch不同的是它可以重复利用,下一步的操作以,依赖上一步是否完成,就像去银行办业务一样,排在你前面的人办好了才轮到你,我们继续通过上节的例子,来改写一下它,这里我偷个懒,实际业务中尽量用类编写,不要直接new Thread。,实际输出:,可以看到在即使在多线程下,每个操作都需要上一个await任务之后执行,使用很简单,也很好理解。,下面我们就一起探究一下,它是如何做到的?,同样的,我们先看构造函数。,​默认barrierAction是null, 这个参数是Runnable参数,当最后线程达到的时候执行的任务,刚刚的例子中没有演示,大家可以在初始化的时候传入一个,打印一下当前的线程名称,这样理解起来比较容易点,parties int型,它的意思是参与的线程数。,我们再看它的定义, 可以看到它没有继承任何类或实现任何接口​。,我们重点看下这个方法。,这个方法干嘛用的呢?等到所有各方都在此屏障上调用了await 。如果当前线程不是最后到达的,则出于线程调度目的将其禁用并处于休眠状态,除了以下情况:,再看dowait(), 它是一个私有方法。,如果被破坏了怎么恢复呢?来看下reset, 源码很简单,break之后重新生成新的实例,对应的会重新初始化count,在dowait里index==0也调用了nextGeneration,所以说它是可以循环利用的。,cyclicBarrier源码相对简单一些,下节给大家讲下Phaser,它是增强版的CountDownLatch,它的实现相对更加复杂一点 。

© 版权声明

相关文章