Java 多线程之 Semaphore(信号量/限流/同步辅助类)

文章目录

    • 一、概述
    • 二、使用方法
    • 三、测试示例

一、概述

  • Semaphore(信号量)是一种并发控制机制,用于控制对共享资源的访问。它维护了一个计数器,可以限制同时访问某个资源的线程数量。常用于限制同时访问某个资源的线程数量,例如控制数据库连接池的并发访问、控制线程池的并发任务数、生产者-消费者问题、读者-写者问题等。

  • 使用 Semaphore ,就像银行取钱一样。假如银行有3个柜台,那么同一时刻最多就只能有3个人取钱,其他人需在等待区等待。当其中某个柜台的人走了以后,等待区的人才能有一个人到柜台办理取钱业务。从而实现限流,保证了柜台业务的正常运作,否则都挤过去就乱了。

  • Semaphore 有两个主要操作:acquire() 和 release()。

    • acquire(): 当一个线程需要访问共享资源时,它可以调用 acquire() 方法。如果计数器大于0,那么线程将获得访问权限,并将计数器减1。如果计数器为0,那么线程将被阻塞,直到有其他线程释放资源并增加计数器。
    • release(): 当一个线程完成对共享资源的访问时,它应该调用 release() 方法来释放资源并增加计数器的值。这将允许其他线程获取访问权限。
    • tryAcquire():尝试获取一个许可证,如果获取成功返回 true,否则返回 false,不会阻塞线程。
  • 注意:Semaphore 通常用来限流,即限制访问某个资源的线程数。而不是用于斥锁资源的访问,如果要用于斥锁资源的问题,则需把初始计数器设置为1。这时它变成了一个二元信号量,通常被称为互斥锁。只允许一个线程同时访问共享资源。

二、使用方法

  • 使用 Semaphore 的方法如下:

    • 声明一个 Semaphore 对象,初始化时指定 同时访问资源 的线程个数。
    • 在业务开始部分使用 semaphore.acquire(); 领取许可证。
    • 完成业务后使用 semaphore.release(); 还回许可证。
    public class SemaphoreExample {private Semaphore semaphore = new Semaphore(5); // 允许同时访问资源的线程数量,这里设置为5,表示可以有5个线程同时访问public void accessResource() {try {semaphore.acquire(); // 获取许可证,如果有许可证,则计数器减1;如果没有可用许可证,则阻塞// 访问共享资源的代码} catch (InterruptedException e) {// 处理中断异常} finally {semaphore.release(); // 释放资源,计数器加1}}
    }
    

三、测试示例

  • 在下面示例中,创建了一个 BankSemaphoreExample 类,模拟银行有5个柜台可以进行取钱业务。在主线程中创建100个线程,模拟100个富豪,然后一起去银行取钱。由于银行使用 Semaphore 限流,同一时刻只能有5个人取钱,其他人会排队等候。

    package top.yiqifu.study.p004_thread;import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Semaphore;public class Test086_Semaphore {public static void main(String[] args) {BankSemaphoreExample bank = new BankSemaphoreExample();List<Thread> threads = new ArrayList();for(int i = 1; i<= 100; i++){Thread t = new Thread(()->{try {bank.getMoney(Thread.currentThread().getName());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});t.setName("富豪"+i);threads.add(t);}for(Thread t : threads){t.start();}for(Thread t : threads){try {t.join();} catch (InterruptedException e) {e.printStackTrace();}}}public static class BankSemaphoreExample {private volatile float Money = 1000 * 10000;private Semaphore semaphore = new Semaphore(5); // 假高银行有5个柜台synchronized void get(float m) {this.Money -= m;}public void getMoney(String people){try {semaphore.acquire();float m = (float) Math.random()* 10000;this.get(m);System.out.println(people+ " 取钱"+m+"元,还有排队富豪="+semaphore.getQueueLength());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}}
    }

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

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

相关文章

MySQL查看和修改时区

为了验证 TIMESTAMP 存储时间与时区有关&#xff0c;显示的值也依赖于时区 看了mysql 时区 时间网 世界时区 MySQL查看和修改时区的方法 查看当前时区 1. 在MySQL客户端&#xff0c;可以通过如下命令查看当前时区&#xff1a; SELECT global.time_zone;2. 查看当前时区的设…

字符串方法

字符串方法 字符串截取slice() 字符串截取subString() 字符串截取substr() 字符串切割slice() 字符串开始start() 字符串结束end() 字符串去空trim() 字符串合并 concat() 字符串包含includes() 字符串下标 indexOf() 字符串倒序查…

【新手解答8】深入探索 C 语言:递归与循环的应用

C语言的相关问题解答 写在最前面问题&#xff1a;探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸&#xff1a;递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流&#xff0c;回想起了当初的我C…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群&#xff08;Zabbix HA&#xff09;二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

【数据结构与算法】JavaScript实现二叉搜索树

文章目录 一、二叉搜索树的封装1.插入数据2.遍历数据2.1.先序遍历2.2.中序遍历2.3.后续遍历 3.查找数据3.1.查找最大值&最小值3.2.查找特定值 4.删除数据4.1.情况1&#xff1a;没有子节点4.2.情况2&#xff1a;有一个子节点4.3.情况3&#xff1a;有两个子节点4.4.完整实现 …

成为AI产品经理——回归模型评估(MSE、RMSE、MAE、R方)

分类问题的评估是看实际类别和预测类别是否一致&#xff0c;它的评估指标主要有混淆矩阵、AUC、KS。回归问题的评估是看实际值和预测值是否一致&#xff0c;它的评估指标包括MAE、MSE、RMSE、R方。 如果我们预测第二天某支股票的价格&#xff0c;给一个模型 y1.5x&#xff0c;…

查询绑定了所有id的name

1、如图&#xff0c;绑定了所有id的有A,B两个name 2、第一种Sql及效率 explain SELECT name,count(id) as count from test GROUP BY name HAVING count(id)(SELECT count(DISTINCT id) from test); 3、第二种sql及效率 explain select * from (SELECT name,count(id) as co…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下&#xff1a; 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

MFC 绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线.

MFC 绘制三种不同圆形以及绘制正弦函数曲线 本文使用visual Studio MFC 平台实现绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线. 关于基础工程的创建请参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-vis…

【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验 Vivado IP 核提供了 XADC 软核&#xff0c;XADC 包含两个模数转换器&#xff08;ADC&#xff09;&#xff0c;一个模拟多路复用器&#xff0c;片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压&#xff0c;也可以用来测…

【五分钟】熟练使用np.interp函数函数(干货!!!)

引言 np.interp函数可对一维数组进行线性插值。具体来说&#xff0c;如果已知xp和yp&#xff0c;并且xp和yp具有确定的对应关系(比如ypsin(xp))&#xff0c;那么对于新的一维数组x&#xff0c;可通过np.interp函数得到数组y&#xff0c;y是基于 xp和yp的映射关系 通过【线性插…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

面了一个测试工程师要求月薪26K,总感觉他背了很多面试题

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

Java8 根据自定义属性去重

一、需求背景 有一个List集合,里面有n个Answer成员,成员种有m个属性,即: List<Answer> answers ...,现在我需要根据Answer的某一个属性对List去重(属性不固定),应该如何实现呢? 二、解决办法 需要满足上述需求&#xff0c;并不难&#xff0c;我们可以使用Java8提供的…

Nacos 安装下载

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 1、Windows安装 开发阶段采用单机安装即可 1.1 下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nac…

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上&#xff0c;官方对组件的使用建议是&#xff1a;附录&#xff1a;其他全端兼容ui库参考文章&#xff1a; 直接看答案 如果想自己纯手写&#xff0c;直接用内置组件。…

it统一运维平台怎么样?有可以推荐的品牌吗?

随着互联网化&#xff0c;随着信息化的不断发展&#xff0c;企业IT系统的规模和复杂性也在日益增加。在这个背景下&#xff0c;IT统一运维平台就应用而生了。它以一种全面、集成的方式管理企业IT资源&#xff0c;从而提高效率、降低成本、改善服务&#xff0c;为企业提供更快更…

「词令」2023年12月5日支付宝蚂蚁庄园今日问题答案是什么?12.5蚂蚁庄园今日问题正确答案

问题&#xff1a;我国哪个城市有“四面荷花三面柳&#xff0c;一城山色半城湖”的美誉&#xff1f; 选项&#xff1a;A、济南 B、泉州 答案&#xff1a;济南 解析&#xff1a;一城山色&#xff1a;千佛山在城南&#xff0c;为附近最高的山&#xff0c;全城人都能看到它苍翠的…

站群尽量选择不同C段多A利于推广

站群推广的注意事项是什么&#xff1f;站群是网站优化推广的重要手段&#xff0c;但也很容易遭到搜索引擎的降权惩罚&#xff0c;如何有效推广而避免被 K呢&#xff0c;需要注意以下事项。 服务器速度及稳定性 高质量的服务器&#xff0c;其必备条件就是高速度、高稳定性。只有…

Linux last命令教程:如何查看用户的登录和注销历史(附案例详解和注意事项)

Linux last命令介绍 last命令在Linux中用于显示自文件/var/log/wtmp创建以来所有用户的登录和注销列表。可以给出一个或多个用户名作为参数&#xff0c;以显示他们的登录&#xff08;和注销&#xff09;时间和主机名。 Linux last命令适用的Linux版本 last命令在大多数Linux…