乐趣区

关于java:Java并发CountDownLatch和CycliBarrier异同点详解

大家好,这里是 淇妙小屋 ,一个分享技术,分享生存的博主
以下是我的主页,各个主页同步更新优质博客,创作不易,还请大家点波关注
掘金主页
后续会公布更多 MySQL,Redis,并发,JVM,分布式等面试热点常识,以及 Java 学习路线,面试重点,职业规划,面经等相干博客
转载请表明出处!

1. CountDownLatch

容许一个或多个线程期待其余线程实现操作

1.1 类图

1.2 办法介绍

  • public CountDownLatch(int count)

    用于初始化 state

  • await()

    如果 state 不为 0,线程进入 WATING 状态(通过 LockSupport),直到 state 变为 0(可中断)

    如果 state 为 0,那么线程不会 WATING

  • countDown()

    将 state-1,如果 state 减为 0——唤醒所有 WATING 线程

1.3 办法详解

  • await()

    底层调用的是 AQS 共享锁加锁的那一套

    Sync 中实现了 tryAcquireShared(int acquires)——如果 state 为 0,那么获得共享锁,如果 state 不为 0,那么获得共享锁失败,后续会通过 LockSupport进入 WATING 状态

  • countDown()

    底层调用的是 AQS 开释共享锁的那一套

    Sync 中实现了 tryReleaseShared(int releases)——如果 state 为 0,返回 false,不会开释锁,如果 state 不为 0,将 state-1

    如果 state- 1 后为 0,那么返回 true,胜利开释锁,唤醒所有 WATING 的线程

    如果 state- 1 后不为 0,那么返回 false,不会开释锁

2. CyclicBarrier

当一组线程达到 CyclicBarrier 时被阻塞,直到最初一个线程达到屏障时,所有被阻塞的线程能力持续运行

(count 初始值为 parties,每当一个线程调用 CyclicBarrier 的 await(),就会让 count-1, 如果 count- 1 后不为 0,那么线程进入 WATING

如果 count- 1 后为 0,就会突破屏障唤醒所有 WATING 的线程)

2.1 类图

2.2 构造方法

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

2.3 await()

可中断

2.4 reset()

  1. 加锁
  2. 调用 nextGeneration()
  3. 调用 breakBarrier()
  4. 开释锁

3. CountDownLatch 与 CyclicBarrier 的区别

  1. CountDownLatch 依附 AQS 实现,CyclicBarrier 依附 Lock 接口与 Condition 接口实现
  2. CountDownLatch 只能应用一次,CyclicBarrier 能够用 reset()重置
退出移动版