CyclicBarrier实现原理

来源:互联网 发布:脑洞网络用语 编辑:程序博客网 时间:2024/06/05 23:49

CyclicBarrier原理

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(也可以叫同步点),即相互等待的线程都完成调用await方法,所有被屏障拦截的线程才会继续运行await方法后面的程序。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该屏障点在释放等待线程后可以重用,所以称它为循环的屏障点。CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达屏障点之后(但在释放所有线程之前),该命令只在所有线程到达屏障点之后运行一次,并且该命令由最后一个进入屏障点的线程执行。

CyclicBarrier中定义的成员属性

private final ReentrantLock lock = new ReentrantLock();private final Condition trip = lock.newCondition();private final int parties;private final Runnable barrierCommand;private Generation generation = new Generation();private int count;

其核心代码是 ReentrantLock 以及 Condition 的共享唤醒线程

多个线程竞争锁,保证计数器parties为原子操作,然后当parties执行为0时候,执行方法

  //唤醒所有处于休眠状态的线程,恢复执行    //重置count值为parties    //重置中断状态为true    private void breakBarrier() {        generation.broken = true;        count = parties;        trip.signalAll();    }

此时所有阻塞的线程继续执行

原创粉丝点击