前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java并发——CountDownLatch和CycliBarrier异同点详解

Java并发——CountDownLatch和CycliBarrier异同点详解

原创
作者头像
淇妙小屋
发布2022-04-03 20:07:44
1850
发布2022-04-03 20:07:44
举报
文章被收录于专栏:面试题详解面试题详解

大家好,这里是淇妙小屋,一个分享技术,分享生活的博主,后续会发布更多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 构造方法
代码语言:javascript
复制
    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()重置

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. CountDownLatch
    • 1.1 类图
      • 1.2 方法介绍
        • 1.3 方法详解
        • 2. CyclicBarrier
          • 2.1 类图
            • 2.2 构造方法
              • 2.3 await()
                • 2.4 reset()
                • 3. CountDownLatch与CyclicBarrier的区别
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档