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的分析就到这里了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,629评论 4 56
  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,868评论 0 44
  • 今天我们一家子相约一起在老屋烧烤,在新房子串好肉备好材料,一起来到老屋的核桃树下,抬茶几搬凳子,找柴火生炉子,不一...
    白卉阅读 663评论 2 6
  • 高效并发是jdk6的一个重要主题。自旋锁在jdk1.4.2中就已经引入,只不过默认是关闭的,jdk1.6中已经改为...
    shammgod_code阅读 154评论 0 0

友情链接更多精彩内容