CyclicBarrier
CyclicBarrier
同步辅助类,允许一组线程互相等待,直到 reach a common on barrier point. barrier point 是 parties 减少到0的时候。CyclicBarrier 在涉及到固定的 party 线程等待成功之后执行一个动作(barrierCommand)的场景。当等待条件满足之后,这个 Barrier 会被重置,所以这个 Barrier 可以循环使用,所以会有 Cyclic(循环)修饰。
barrierCommand 在 barrier point 到达的时候,被会执行,但是,此时其它的线程并没有被释放。直到 barrierCommand 执行完成,其它 party 线程才会从 await中唤醒,然后返回。A CyclicBarrier supports an optional Runnable command that is run once per barrier point, after the last thread in the party arrives, but before any threads are released.
barrierCommand 一般用来做什么呢?在其它 party 继续执行之前,更新共享状态。This barrier action is useful for updating shared-state before any of the parties continue.
- dowait — CyclicBarrier 实现的核心
1 | private int dowait(boolean timed, long nanos) |
参考
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。