聊聊java中的CountDownLatch,CyclicBarrier,Semaphore

CountDownLatch(倒计时器)

是什么:
CountDownLatch是Java中的一个同步工具类,它允许一个或多个线程等待其他线程完成操作

使用场景:

  1. 当一个线程需要等待多个其他线程执行完毕后才能继续执行时,可以使用CountDownLatch。例如,启动一个服务时,主线程可能需要等待多个组件加载完毕。
  2. 实现多个线程开始执行任务的最大并行性。即多个线程在同一时刻开始执行,类似于赛跑中的发令枪响后所有选手同时起跑。

实现原理:
CountDownLatch内部维护了一个计数器,通过countDown()方法减少计数器的值,通过await()方法让线程在计数器归零之前处于等待状态。当计数器的值变为0时,所有在CountDownLatch上await()的线程将被唤醒。

CountDownLatch示例

import java.util.concurrent.CountDownLatch;  public class CountDownLatchExample {  public static void main(String[] args) throws InterruptedException {  int numberOfThreads = 3;  CountDownLatch countDownLatch = new CountDownLatch(numberOfThreads);  for (int i = 0; i < numberOfThreads; i++) {  new Thread(() -> {  System.out.println(Thread.currentThread().getName() + " 准备完毕!");  countDownLatch.countDown(); // 计数器减1  }).start();  }  countDownLatch.await(); // 等待计数器归零  System.out.println("所有线程准备完毕,可以开始比赛了!");  }  
}

 示例说明:在CountDownLatchExample中,我们创建了一个倒计时门闩,初始化为3,然后启动了3个线程。每个线程在完成准备工作后调用countDown()方法,主线程通过await()方法等待所有线程准备完毕。

CyclicBarrier(循环屏障)

是什么:
CyclicBarrier也是Java中的一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(common barrier point)后才能继续执行

使用场景:
CyclicBarrier常用于需要多个线程相互协作,共同完成某个任务的场景。例如,一个寝室的四个人约好了去球场打球,由于四个人准备工作不同,所以约好在楼下集合,等四个人都到齐后一起出发去球场。

实现原理:
CyclicBarrier内部维护了一个计数器和一个屏障点。每当一个线程调用await()方法时,计数器的值就会减1。当计数器的值减至0时,表示所有线程都已到达屏障点,此时屏障会被打开,所有等待的线程将继续执行。CyclicBarrier还可以设置一个可选的Runnable对象,在所有线程到达屏障点时执行该对象的run()方法。

CycliBarrier示例:

import java.util.concurrent.BrokenBarrierException;  
import java.util.concurrent.CyclicBarrier;  public class CyclicBarrierExample {  public static void main(String[] args) {  int numberOfThreads = 4;  CyclicBarrier cyclicBarrier = new CyclicBarrier(numberOfThreads);  for (int i = 0; i < numberOfThreads; i++) {  new Thread(() -> {  System.out.println(Thread.currentThread().getName() + " 已到达集合点");  try {  cyclicBarrier.await(); // 等待所有线程到达集合点  } catch (InterruptedException | BrokenBarrierException e) {  e.printStackTrace();  }  System.out.println(Thread.currentThread().getName() + " 出发去球场!");  }).start();  }  }  
}

示例说明: 在CyclicBarrierExample中,我们创建了一个循环屏障,需要4个线程到达后才能继续。每个线程在到达集合点后调用await()方法等待其他线程,当所有线程都到达后,它们将一起继续执行。

Semaphore(信号量)

是什么:
Semaphore是Java中的一个用于控制同时访问特定资源的线程数量的同步工具

使用场景:
Semaphore主要用于那些资源有明确访问数量限制的场景,常用于限流。例如,数据库连接池、线程池或同时访问某个接口的请求数量等。通过Semaphore可以控制同时访问资源的线程数量,防止因资源过度使用而导致的系统崩溃或性能下降。

实现原理:
Semaphore内部维护了一个计数器和多个等待队列。计数器的值表示当前可用的资源数量(即信号量数量)。当线程调用acquire()方法时,会尝试获取一个信号量(即将计数器减1),如果当前没有可用的信号量,则线程会被阻塞并放入等待队列中。当其他线程释放信号量(即调用release()方法将计数器加1)时,会从等待队列中唤醒一个或多个线程来获取信号量并继续执行。这种方式可以保证对资源的有序访问和合理利用。

Semaphore示例:

import java.util.concurrent.Semaphore;  public class SemaphoreExample {  public static void main(String[] args) {  int maxPermits = 2; // 最大允许同时访问的资源数量  Semaphore semaphore = new Semaphore(maxPermits);  for (int i = 0; i < 5; i++) {  new Thread(() -> {  try {  semaphore.acquire(); // 获取一个许可  System.out.println(Thread.currentThread().getName() + " 进入了停车场");  Thread.sleep(1000); // 模拟停车时间  } catch (InterruptedException e) {  e.printStackTrace();  } finally {  semaphore.release(); // 释放一个许可  System.out.println(Thread.currentThread().getName() + " 离开了停车场");  }  }).start();  }  }  
}

示例说明:在SemaphoreExample中,我们创建了一个信号量,允许最多2个线程同时访问资源(这里是模拟的停车场)。每个线程在访问资源前需要调用acquire()方法获取许可,访问完成后调用release()方法释放许可。这样可以确保同时访问资源的线程数量不会超过信号量设定的最大值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROM-IP

1.原理 通过添加数据文件&#xff0c;使ROM看起来不是易失性存储器&#xff0c; 产生256个数据&#xff0c;每个数据的位宽是8 如果前面为x&#xff0c;后面就是x256-1 2.单端口ROM配置 FPGA内部没有非易失性存储器。调用的ROM和RAM都是用RAM来生成的 3.双端口ROM配置 使用第一…

大学 Python 程序设计实验报告:判断密码是否符合要求

目录&#xff1a; 利用 string 模块判断使用正则表达式判断 密码强度判断&#xff0c;输入一个密码&#xff0c;判断密码是否符合要求。 要求密码长度8-12位&#xff0c;密码中必须包含大写字母、小写字母和数字&#xff0c;不能含有其他符号。 如果符合要求输出"密码符合…

Dubbo 几种方式来传递和使用隐式参数

在 Dubbo 中&#xff0c;隐式参数通常指的是那些不直接作为 RPC 方法参数传递&#xff0c;但需要在 RPC 调用过程中共享或传递的信息。这些信息可能包括用户身份、请求标识、认证令牌等。Dubbo 提供了几种方式来传递和使用这些隐式参数。 以下是使用 Dubbo 隐式参数的一些常见…

马斯克旗下xAI发布Grok-1.5,相比较开源的Grok-1,各项性能大幅提升,接近GPT-4!

本文原文来自DataLearnerAI官方网站&#xff1a;马斯克旗下xAI发布Grok-1.5&#xff0c;相比较开源的Grok-1&#xff0c;各项性能大幅提升&#xff0c;接近GPT-4&#xff01; | 数据学习者官方网站(Datalearner) 继Grok-1开源之后&#xff0c;xAI宣布了Grok-1.5的内测消息&…

C#热门技术应用:跨平台、异步编程与云原生

C#热门技术应用&#xff1a;跨平台、异步编程与云原生 C#&#xff0c;作为微软主导的编程语言&#xff0c;近年来在跨平台应用开发、异步编程以及云原生应用等领域展现出了强大的生命力。这些热门技术的应用&#xff0c;使得C#成为了现代软件开发中不可或缺的一部分。 一、跨平…

手撕算法-跳跃游戏

描述 分析 如果某一个作为 起跳点 的格子可以跳跃的距离是 3&#xff0c;那么表示后面 3 个格子都可以作为 起跳点可以对每一个能作为 起跳点 的格子都尝试跳一次&#xff0c;把 能跳到最远的距离 不断更新如果可以一直跳到最后&#xff0c;就成功了 代码 class Solution {…

07-JavaScript DOM事件

1. 事件 1.1 事件概述 JavaScript 使我们有能力创建动态页面&#xff0c;而事件是可以被 JavaScript 侦测到的行为。 简单理解&#xff1a; 触发--- 响应机制。 网页中的每个元素都可以产生某些可以触发 JavaScript 的事件&#xff0c;例如&#xff0c;我们可以在用户点击某…

【漏洞潜在风险】弹框干扰类风险

弹框干扰风险定义: 游戏过程中&#xff0c;客户端经常会以文字类形式对玩家进行说明和指引&#xff0c;而对于一些更为重要的信息&#xff0c;便会用游戏中的弹框进行强调。由玩家主动触发对其他玩家造成重复弹框进而干扰到正常游戏的都可以称之为弹框干扰类风险。弹框干扰风险…

C++项目——集群聊天服务器项目(六)MySQL模块

Hello&#xff0c;大家好啊&#xff0c;最近比较忙&#xff0c;没来得及更新项目&#xff0c;实在抱歉~今天就恢复更新拉~ 在验证完网络模块与业务模块代码可以正常使用后&#xff0c;需完成的操作是与底层数据库进行交互&#xff0c;为实现各类用户查询、增删业务奠定良好的基…

【笔记】Android U RILJ 中与运营商名称SPN显示相关的日志分析

源码阅读&#xff1a;AOSPXRef 常用日志关键字 Note&#xff1a;">"下发MD&#xff0c;"<"MD上报&#xff0c;[]中的id有请求和返回的对应关系 KEYComment> OPERATOR下发MD&#xff0c;请求运营商信息< OPERATORMD上报运营商注册信息> DA…

Java--队列

无界队列 public class Task implements Runnable, Comparable<Task>{private int priority; // 优先级别public Task(int priority) {this.priority priority;}// 当前对象和其他对象作比较, 当前优先级大就返回-1, 优先级小就返回1, 值越小, 优先级越高.Overridepubl…

【群晖】白群晖如何公网访问

【群晖】白群晖如何公网访问 ——> 点击查看原文 在使用默认配置搭建好的群晖NAS后&#xff0c;我们可以通过内网访问所有的服务。但是&#xff0c;当我们出差或者不在家的时候也想要使用应该怎么办呢&#xff1f; 目前白群提供了两种比较快捷的方式&#xff0c;一种是直接注…

【Python系列】合并配置文件的最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python实现两个Excel表格数据对比、补充、交叉验证

业务背景 业务中需要用到类似企查查一类的数据平台进行数据导出&#xff0c;但企查查数据不一定精准&#xff0c;所以想采用另一个官方数据平台进行数据对比核验&#xff0c;企查查数据缺少的则补充&#xff0c;数据一致的保留企查查数据&#xff0c;不一致的进行颜色标注。 …

脱壳之常用的加固样本特征

梆梆加固样本特征 清单文件入口 android:name“com.SecShell.SecShell.ApplicationWrapper” 特征 免费版 meta-data meta-data总结 assets/secData0.jar lib/armeabi/libSecShell.so lib/armeabi/libSecShell-x86.so 梆梆企业版 assets/classes0.jar lib/armeabi-v7a/libD…

第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

人工智能时代&#xff0c;最需要学习的编程语言是&#xff1a;python 。笔者是个 python 小白&#xff0c;昨天花了两个小时&#xff0c;第一次成功运行起来 python 项目 。 项目是 powerpoint-extractor &#xff0c;可以将 ppt 文件中的图片提取出来&#xff0c;并输出到固定…

Date的Invalid Date

使用Date()构造日期对象&#xff0c;如果传入非日期格式或者错误的日期格式的字符串&#xff0c;仍然能构造出Date对象。 var date new Date("dream"); console.log(date:, date); //Invalid Date console.log(date:, typeof date); //“object” console.log(da…

js 拼接HTML时 onclick方法和传参报错[onject Object] 和 unexpected end of input`

Vue js拼接onclick事件 1.onclick 方法函数找不到2.方法中传参2.1 int 类型传参&#xff08;直接传参&#xff09;2.2 字符串类型&#xff08;需要加引号&#xff09;2.3 对象&#xff08;对象是不能直接拼接的。拼接的必须是字符串。因此需要将对象转成字符串。&#xff09; 1…

全量知识系统 之“程序”详细设计 之 “絮”---开端“元素周期表”表示的一个“打地鼠”游戏

全量知识系统 之“程序”详细设计 概述-概要和纪要 序 絮&#xff08;一个极简的开场白--“全量知识系统”自我介绍&#xff09; 将整个“人生”的三个阶段 比作“幼稚园”三班 &#xff1a; 第一步【想】-- “感性”思维游戏&#xff1a;打地鼠 。学前教育-新生期&#x…

js的Number对象和全局对象

文章目录 1. Number 对象1.1. 含义1.2. 属性1.3. 方法 2. 全局对象2.1. 含义2.2. 特点2.3. 属性2.4. 方法 3. 函数的本质 1. Number 对象 1.1. 含义 Number 对象是原始数值的包装对象。 const num 2.334; const obj new Number(num); console.log(obj); //Number console.…