首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java JUC并发包之CyclicBarrier循环栅栏

Java JUC并发包之CyclicBarrier循环栅栏

作者头像
鱼找水需要时间
发布2023-02-16 19:56:02
发布2023-02-16 19:56:02
4260
举报
文章被收录于专栏:SpringBoot教程SpringBoot教程

文章目录

前言

CyclicBarrier 字面意思是循环栅栏,是一个同步的工具,能够允许一组线程去互相等待直到都到达了屏障,CyclicBarrier对于涉及到固定大小的线程是非常有用的,线程们必须相互等待。该屏障称之为循环屏障,是因为当等待屏障的线程被释放之后,该屏障能循环使用。

什么意思呢?假如有五个探险者去探险,在他们前方有三道门,每道门都需要五个人同时发力召唤神龙才能打开,如果有一个人走的特别快,它先到达了门前,但是它一个人打不开门,需要五个人同时抵达才能打开门,所以走的快的只能等待最慢的达到,一组五个人到齐之后才能执行打开门这个动作。

代码示例

模拟五个人过门的案例

代码语言:javascript
复制
@GetMapping(value = "/cyclicBarrier")
public void cyclicBarrier() {
    // 参与的线程数
    int threadNum = 5;
    //创建cyclicBarrier实例,定义barrierAction
    CyclicBarrier cyclicBarrier = new CyclicBarrier(5, () ->
            System.out.println("已到全部通过栅栏")
    );
    //创建线程开始执行
    for (int i = 1; i <= threadNum; i++) {
        new Thread(() -> {
            for (int j = 1; j <= 3; j++) {
                try {
                    Random rand = new Random();
                    //随机一个2-5的整数
                    int randomNum = rand.nextInt(4) + 2;
                    Thread.sleep(randomNum * 1000);
                    System.out.println(Thread.currentThread().getName() + ", 通过了第" + j +
                            "道栅栏, " +
                            "使用了 " + randomNum + "s");
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }, "thread--" + i).start();
    }
}

运行结果:

总结

示意图:

CyclicBarrier是借助ReentrantLock加上Condition 等待唤醒的功能 进而实现的,在构建CyclicBarrier时,传入的值会赋值给CyclicBarrier内部维护count变量,也会赋值给parties变量(这是可以复用的关键)。

每次调用await时,会将count -1 ,操作count值是直接使用ReentrantLock来保证线程安全性。如果count不为0,则添加则condition队列中。如果count等于0时,则把节点从condition队列添加至AQS的队列中进行全部唤醒,并且将parties的值重新赋值为count的值(实现复用)。

完整代码已上传 Gitee Spring整合常用组件

到此,本章内容就介绍完啦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 代码示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档