并发控制之CyclicBarrier

news/2024/12/21 4:25:38/

CyclicBarrier

作用

同步辅助类,多个线程互相等待,直到到达同一个同步点,再继续一起执行,可有重复利用,通过构造函数可以设置一个等待的线程数,

线程调用await方法表示自己已经到达屏障点,然后会等待其他线程也到达。如果当前线程不是最后一个到达的,它将被阻塞在这里,直到所有线程都调用了await方法。

示例代码

java">
public class Test {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(3);for (int i = 0; i < 3; i++) {final int threadId = i;new Thread(() -> {try {System.out.println("线程 " + threadId + " 开始执行任务");Thread.sleep((long) (Math.random() * 3000));System.out.println("线程 " + threadId + " 到达屏障点");barrier.await();// 在此处等待,直到3个线程都到达此处开始执行下面代码System.out.println("线程 " + threadId + " 继续执行后续任务");} catch (Exception e) {e.printStackTrace();}}).start();}}
}

使用场景

  • 模拟并发测试:在进行并发测试时,需要模拟多个并发请求同时到达某个点的情况,CyclicBarrier可以方便地实现这种场景,让所有模拟的并发线程在指定点等待,然后一起继续执行后续的测试操作
  • 多线程任务协同:例如在一个并行计算任务中,需要多个线程分别处理不同的数据块,当所有数据块都处理完毕后,再进行汇总或下一步的计算,这时可以使用CyclicBarrier来确保所有线程都完成各自的任务后再继续。

实现原理

java">private final ReentrantLock lock = new ReentrantLock();/** Condition to wait on until tripped */private final Condition trip = lock.newCondition();/** The number of parties */private final int parties;/** The command to run when tripped */private final Runnable barrierCommand;/** The current generation */private Generation generation = new Generation();/*** Number of parties still waiting. Counts down from parties to 0* on each generation.  It is reset to parties on each new* generation or when broken.*/private int count;

内部维护一个 ReentrantLock 和一个 Condition trip = lock.newCondition();

Generation 表示第几轮,CyclicBarrier 是可以循环利用的

count 表示等待的线程数

  • 调用await方法时,调用线程会去获取lock锁,然后–count,count减 1,表示有一个线程已经到达屏障点。
  • 接着判断count是否为 0,如果count不为 0,说明还有线程未到达屏障点,此时当前线程会调用trip.await()方法进入等待状态,并释放lock锁,让其他线程有机会获取锁并执行await操作。
  • 当count为0 时,就唤醒所有在trip 等待的线程执行,同时Generation 次数加1

http://www.ppmy.cn/news/1556822.html

相关文章

Object.prototype.hasOwnProperty.call(item, key) 作用与用途

在 JavaScript 中&#xff0c;Object.prototype.hasOwnProperty.call(item, key) 是一种检查对象 item 是否具有特定属性 key 作为自身的属性&#xff08;而不是继承自原型链&#xff09;的方法。这种调用方式是安全的&#xff0c;特别是在处理可能被修改过原型链的对象时。 解…

敏捷多模态微型机器人:独特的被动变形轮设计

大家好&#xff01;今天来了解一种微型机器人——《An agile multimodal microrobot with architected passively morphing wheels》发表于《SCIENCE ADVANCES》。这个微型机器人&#xff0c;具有独特的设计和卓越的性能。它带有被动变形轮子&#xff0c;这种轮子的设计灵感源自…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

【Vue-4小时速通01-ES6】

1.var和let的区别 1.1作用域与有效范围 var 在函数或全局作用域中声明变量&#xff0c;无论在块级作用域内外都可以访问。 var 即使在块级作用域外部访问&#xff0c;仍然能获取到结果。 let 在块级作用域内声明变量&#xff0c;仅在其所在的作用域中有效。 let 如果在作用域…

利用API接口优化电商平台的用户体验

在电子商务领域&#xff0c;API&#xff08;应用程序编程接口&#xff09;接口作为连接前后端服务、处理用户请求和数据交换的关键组件&#xff0c;其性能直接关系到电商平台的用户体验和整体运营效率。一个高效、稳定的API接口能够显著提升用户满意度&#xff0c;降低运营成本…

大模型呼出机器人如何赋能呼叫中心?(转)

大模型呼出机器人如何赋能呼叫中心&#xff1f;(转) 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人在赋能呼叫中心方面发挥着重要作用&#xff0c;它通过整合先进的人工智能技术&#xff0c…

【k8s集群应用】K8S二进制安装大致步骤(简略版)

文章目录 K8S二进制安装部署etcd测试etcd集群&#xff08;可选&#xff09;恢复etcd数据库 部署master组件部署node组件K8S kubeadm安装关键命令更新kubeadm安装的K8S证书有效期方法一方法二查看证书有效期 K8S二进制安装 部署etcd 使用cfssl工具签发证书和私钥下载解压etcd软…

构建一个rust生产应用读书笔记7-确认邮件1

亲爱的读者们&#xff0c;在前一章中&#xff0c;我们介绍了对新订阅者的电子邮件地址的验证——它们必须符合电子邮件格式。 现在我们拥有的电子邮件虽然在语法上是有效的&#xff0c;但我们仍然不确定这些邮箱是否真的存在&#xff1a;有人实际使用这些电子邮件地址吗&#x…