CyclicBarrier 与 CountDownLatch

本贴最后更新于 546 天前,其中的信息可能已经时过境迁

alexlisovenko7UyAY4ao7sYunsplash.jpg

功能

CyclicBarrier 可以重复使用的原因

private int dowait(boolean timed, long nanos)
    throws InterruptedException, BrokenBarrierException,
           TimeoutException {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        final Generation g = generation;
        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();
            }
        }
        ......
}
------------------------------------------------
private void nextGeneration() {
    // signal completion of last generation
    trip.signalAll();
    // set up next generation
    count = parties;
    generation = new Generation();
}

CountDownLatch

Syn

CountDownLatch 使用的 AQS,主要定义了一个内部类 Sync 实现 AQS

因为 CountDownLatch 是共享锁,所以 Sync 重载的 tryAcquireSharedtryReleaseShared

当初始化 CountDownLatch 时需要指定数量,最后这个数量会被 Syn 使用,作为 AQS 的 state

流程

  • 代码
    447 引用 • 545 回帖 • 6 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3012 引用 • 8158 回帖 • 548 关注
1 操作
614756773 在 2020-07-26 15:45:49 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...