Java并发编程(六) CyclicBarrier

下面我们来说一下CyclicBarrier,我们知道,CountDownLatch是一个线程等待多个线程执行,那么CyclicBarrier是多个线程互相等待一起到达,再一起执行。CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行。下面我们就来分析一下CyclicBarrier
先来看一下CyclicBarrier这个类

public CyclicBarrier(int parties) {
    this(parties, null);
}

public CyclicBarrier(int parties, Runnable barrierAction) {
    if (parties <= 0) throw new IllegalArgumentException();
    this.parties = parties;
    this.count = parties;
    this.barrierCommand = barrierAction;
}

CyclicBarrier的构造方法有2个参数,一个是线程数量parties,一个是屏障打开后的操作barrierAction。
CyclicBarrier的实现基于ReentrantLock,下面来看一下具体的实现,先来看一下await方法

public int await() throws InterruptedException, BrokenBarrierException {
    try {
        return dowait(false, 0L);
    } catch (TimeoutException toe) {
        throw new Error(toe); // cannot happen
    }
}

再到dowait方法

if (g.broken)
            throw new BrokenBarrierException();

        if (Thread.interrupted()) {
            breakBarrier();
            throw new InterruptedException();
        }

        int index = --count;
        if (index == 0) {  // tripped
            boolean ranAction = false;
            try {
                final Runnable command = barrierCommand;
                if (command != null)
                    command.run();
                ranAction = true;
                nextGeneration();
                return 0;
            } finally {
                if (!ranAction)
                    breakBarrier();
            }
        }

再到breakBarrier方法

private void breakBarrier() {
    generation.broken = true;
    count = parties;
    trip.signalAll();
}

每次调用await方法,count减1,当count=0时,调用signalAll方法唤醒所有线程继续执行。
CyclicBarrier的分析就到这里了。

你可能感兴趣的:(Java并发编程(六) CyclicBarrier)