Semaphore
关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、使用
- 四、原理
- 五、 推荐阅读
一、导读
我们继续总结学习Java基础知识,温故知新。
本文涉及知识点:
AQS - AbstractQueuedSynchronizer
CAS(Compare And Swap)
锁概念 volatile
二、概览
ˈseməfɔː®
Semaphore 是信号量的意思,作用是控制访问特定资源的线程数量。
在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源
Semaphore叫做信号量,和 CountDownLatch CyclicBarrier 两个不同的是,他的计数器是递增的。
三、使用
控制访问特定资源的线程数量,通常用于那些资源有明确访问数量限制的场景,常用于限流
如:买火车票,游乐场设施。
Semaphore在构造的时候, 可以传入一个int. 表示有多少许可(permit). 线程获取锁的时候, 要告诉信号量使用多少许可, 当线程要使用的许可不足时, 则调用的线程则会被阻塞.
游乐园中的某个游乐设施的管理员,用来控制同时玩这个游乐设施的人数。比如跳楼机只能坐十个人,就设置 Semaphore 的 permits 等于 10
public class SemaphoreTest {public static void main(String[] args) {//创建permits等于2Semaphore semaphore=new Semaphore(2);//开五个线程去执行PlayGamefor (int i = 0; i < 5; i++) {new Thread(new PlayGame(semaphore)).start();}}static class PlayGame extends Thread{Semaphore semaphore;public PlayGame(Semaphore semaphore){this.semaphore=semaphore;}@Overridepublic void run() {try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"获得一个许可证");Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"释放一个许可证");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}
}
四、原理
利用了 AQS - AbstractQueuedSynchronizer 的共享锁来实现,同时获取信号量有公平和非公平两种策略。
我们来看下源码
// 1、初始化,传人最大资源数
public Semaphore(int permits)acquire()
获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。
调用Semaphore#acquire() 方法, 它本质上是调用的AQS#acquireSharedInterruptibly(int), 参数为1
// 调用 AQS#doAcquireSharedInterruptibly(1) 方法
acquire(int permits)
获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。acquireUninterruptibly()
获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。tryAcquire()
尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。
tryAcquire(long timeout, TimeUnit unit)
尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。
release()
释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。drainPermits()
清空令牌把可用令牌数置为0,返回清空令牌的数量。
availablePermits()
返回可用的令牌数量。
Semaphore的内部类公平锁(FairSync)和非公平锁(NoFairSync)各自实现不同的获取锁方法,默认公平锁。
子类的任务有:
1.通过CAS操作维护共享变量state。
2.重写资源的获取方式。
3.重写资源释放的方式。
1.主线程调用acquire()方法时,用当前信号量值-需要获取的值,如果小于0,则进入同步阻塞队列,大于0则通过CAS设置当前信号量为剩余值,同时返回剩余值
2.子线程调用release()给当前信号量值计数器+1(增加的值数量由传参决定),同时不停的尝试因为调用acquire()进入阻塞的线程
/*** 获取1个令牌*/public void acquire() throws InterruptedException {sync.acquireSharedInterruptibly(1);}
五、 推荐阅读
Java 专栏
SQL 专栏
数据结构与算法
Android学习专栏
相关文章:
Semaphore
关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览…...
视频插帧EMAVFI:extracting motion and appearance via inter-frame attention for video
文章目录 EMAVFI:extracting motion and appearance via inter-frame attention for efficient video frame interpolation1.核心概述2.帧间注意力机制为什么可以表示运动信息3.网络架构4.dataset类5.demo推理和训练代码6.总结 EMAVFI:extracting motion and appearance via in…...
⑨数据中心-M-LAG技术配置
华三数据中心网络是指华三提供的专门设计用于数据中心环境的网络解决方案。这种网络通常具有高性能、可扩展性和可靠性,旨在支持大规模数据中心的需求。华三数据中心网络解决方案通常包括以下特点: 1. 高带宽:支持高密度数据中心环境中大量网…...
永磁同步电机无速度算法--基于HOPLL的滑模观测器
一、原理介绍 传统PLL算法为二阶系统,其实现是基于转速变化变化缓慢的假设,因此在转速频繁出现动态变化时会导致动态性能不佳。为改善系统动态性能,将转速微分量引入PLL中,作为附加状态变量,与电角速度及转速共同构成…...
【Linux网络】网络套接字socket
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12891150.html 目录 Socket 编程预备 理解源 IP 地址和目的 IP 地址 认识端口号 端口号范围划分…...
ubuntu wifi配置(命令行版本)
1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码,Password是wifi的密码3、查看连接情况 nmcli dev status...
配环境的经验
pip install -e . 该命令用于以“编辑模式”(也称为开发模式)安装当前目录下的 Python 包,比如包含有 setup.py、setup.cfg 或 pyproject.toml 文件的项目-e 是 --editable 的简写。以编辑模式安装时,pip 会在你的 Python 环境中创…...
STM32cubmax配置STM32407VET6,实现网络通信
文章目录 一、开发准备1、硬件准备2、软件准备 二、STM32CubeMX工程配置步骤1、创建新工程 三、外设配置步骤1)调试接口(SWD)配置2)时钟配置3)串口(USART)配置4)IO口配置(…...
LeetCode 热题 100_完全平方数(84_279_中等_C++)(动态规划(完全背包))
LeetCode 热题 100_完全平方数(84_279) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划(完全背包)): 代码实现代码实现(思路一…...
【C++】vector的底层封装和实现
目录 目录前言基本框架迭代器容量第一个测试,野指针异常第二轮测试,浅拷贝的问题 元素访问修改操作push_backinsert迭代器失效问题 erase 默认成员函数构造函数双重构造引发调用歧义 拷贝构造赋值重载析构函数 源码end 目录 前言 废话不多说࿰…...
AI前端组件库Ant DesIgn X
Ant Design X AI:体验新秩序 Ant Design 团队精心打造 RICH 设计范式,为 AI 界面提供卓越解决方案,引领智能交互新体验。 设计语言与理论 官网: Ant Design X - 轻松打造 AI 驱动的界面。 AI 设计范式 —— RICH 是我们在蚂蚁…...
BGP路由协议之解决 IBGP 水平分割带来的问题
主要有以下 3 种方案: 全互联 :配置量大、耗费资源联邦: 配置量大、邻居会重建、中断时间较长RR 路由反射器:目前主流使用、简单、好用 联邦 IBGP 水平分割问题用与防止 AS 内部产生环路,在很大程度上杜绝了 IBGP 路…...
基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)
基于Java的人脸识别在线考试系统(jspspringbootmysql8.x) 在线考试系统提供全面的考试管理和用户管理功能。登录界面支持管理员、教师和学生三种身份验证,确保不同用户访问相应的功能模块。系统自动组卷功能允许管理员根据不同科目和题型,如单选题、多选…...
如何对LLM大型语言模型进行评估与基准测试
基础概念 这几年,随着生成式 AI 和大型语言模型(LLMs)的兴起,AI 领域整体迎来了一波大爆发。 随着各种基于 LLM 的应用程序在企业里落地,人们开始需要评估不同推理部署方案的性价比。 LLM 应用的部署成本,…...
C语言内存函数和数据在内存的存储
一、内存操作函数深度解析 函数名原型核心特性典型应用场景注意事项memcpyvoid* memcpy(void* dest, const void* src, size_t num)内存块无重叠复制,性能高数组拷贝、结构体复制1. 必须确保目标空间足够 2. 不支持重叠内存(用memmove替代) …...
ChatGPT之智能驾驶问题讨论
ChatGPT之智能驾驶问题讨论 1. 源由2. 问题:2.1 智能驾驶级别定义🚗 L2(部分自动化,Partial Automation)🤖 L3(有条件自动化,Conditional Automation)🛸 L4&a…...
【PalladiumZ2 使用专栏 1 -- 波形 trigger 抓取详细介绍】
文章目录 Palladium Z2 OverviewPalladium 波形抓取Palladium 波形存放文件创建Palladium Trigger 断点设置Palladium 加探针并 dumpPalladium 波形查看 Palladium Z2 Overview Cadence Palladium Z2 是 Cadence 推出的企业级硬件仿真加速平台,旨在应对复杂 SoC 设…...
elasticsearch 8设置验证登录查询
最近总是困扰于9200网络勒索,老是在捣乱,动不动给我清理了index,实在是费劲,今天研究了下config配置,设置ca验证。 以下是完整的步骤和配置,确保生成的证书文件与elasticsearch.yml的配置一致: 1. 生成CA证书 运行以下命令生成CA证书:让输入账号或密码请直接回车。 …...
为什么使用了CDN源服务器需要关闭防火墙?
在网站运营过程中,不少站长会遇到这样的困惑:当使用 CDN 源服务器时,好像就得关闭源服务器的防火墙,不然就状况百出。这背后究竟是什么原因呢? 当你在浏览网页时,要是看到 “502 - 服务暂时不可用” 的提…...
Android 学习之 Navigation导航
1. Navigation 介绍 Navigation 组件 是 Android Jetpack 的一部分,用于简化应用内导航逻辑,支持 Fragment、Activity 和 Compose 之间的跳转。核心优势: 单 Activity 架构:减少 Activity 冗余,通过 Fragment 或 Com…...
初识 Three.js:开启你的 Web 3D 世界 ✨
3D 技术已经不再是游戏引擎的专属,随着浏览器技术的发展,我们完全可以在网页上实现令人惊艳的 3D 效果。而 Three.js,作为 WebGL 的封装库,让 Web 3D 的大门向更多开发者敞开了。 这是我开启这个 Three.js 专栏的第一篇文章&…...
PyTorch 笔记
简介与安装 PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由C实现,应用于人工智能领域,如计算机视觉和自然语言处理。 PyTorch 最初由 Meta Platforms 的人工智能研究团队开发,现在属 于Linux 基金会的…...
day24学习Pandas库
文章目录 三、Pandas库4.函数计算3遍历3.1.遍历Series对象3.2.遍历DataFrame对象 4排序4.1 sort_index4.2 sort_values 5.去重drop_duplicates6.先分组在计算6.1 groupby6.2 filter过滤 7.合并未完待续.. 三、Pandas库 4.函数计算 3遍历 3.1.遍历Series对象 在讲解Series部…...
AI日报 - 2025年4月8日
AI日报 - 2025年4月8日 🌟 今日概览(60秒速览) ▎🤖 模型进展 | Llama 4发布引爆讨论 (性能、应用、部署、训练争议),OpenAI保持高速迭代,香港大学推Dream 7B扩散模型。 Meta Llama 4 Scout & Maveric…...
Linux学习笔记(2) 命令基础:从概念到实践(期末,期中复习笔记全)
前言 一、认识命令行与命令 二、Linux 命令的基础格式 三、命令示例解析 (1)ls -l /home/itheima (2)cp -r test1 test2 四结语 前言 在 Linux 系统的世界里,命令行是与系统交互的重要方式。熟练掌握 Linux 命令…...
langgraph简单Demo4(checkpoint检查点)
在 langgraph 里,检查点(checkpoint)是一项重要的功能,它能够记录工作流在执行过程中的中间状态。当工作流因某些原因中断时,可以从检查点恢复继续执行,避免从头开始,提升效率。 示例ÿ…...
【题解】AtCoder AT_abc400_c 2^a b^2
题目大意 我们定义满足下面条件的整数 X X X 为“好整数”: 存在一个 正整数 对 ( a , b ) (a,b) (a,b) 使得 X 2 a ⋅ b 2 X2^a\cdot b^2 X2a⋅b2。 给定一个正整数 N N N( 1 ≤ N ≤ 1 0 18 1\le N\le 10^{18} 1≤N≤1018)ÿ…...
七种驱动器综合对比——《器件手册--驱动器》
目录 九、驱动器 概述 定义 功能 分类 1. 按负载类型分类 2. 按功能特性分类 工作原理 优势 应用领域 详尽阐述 1 隔离式栅极驱动器 定义 工作原理 应用场景 优势 2 变压器驱动器 定义 工作原理 应用场景 优势 设计注意事项 3 LED驱动 定义 功能与作用 应用场景 设计…...
GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、O…...
西湖大学团队开源SaProt等多款蛋白质语言模型,覆盖结构功能预测/跨模态信息搜索/氨基酸序列设计等
2025 年 3 月 22—23 日,上海交通大学「AI 蛋白质设计峰会」正式举行。 本次峰会汇聚了来自清华大学、北京大学、复旦大学、浙江大学、厦门大学等知名高校的 300 多位专家学者,以及 200 余位行业领军企业代表和技术研发人员,深入探讨了 AI 在…...
ansible+docker+docker-compose快速部署4节点高可用minio集群
目录 github项目地址 示例服务器列表 安装前 修改变量文件group_vars/all.yml 修改ansible主机清单 修改setup.sh安装脚本 用法演示 安装后验证 github项目地址 https://github.com/sulibao/ansible_minio_cluster.git 示例服务器列表 安装前 修改变量文件group_var…...
说话人分离中的聚类方法:深入解析Agglomerative聚类、KMeans聚类和Oracle聚类
说话人分离(Speaker Diarization)是将音频流根据说话人身份划分为同质片段的过程。这一过程中的关键步骤是聚类,即将说话人嵌入(embeddings)分组为不同的簇,每个簇代表一个独特的说话人。在pyannote.audio管…...
蓝桥杯真题——前缀总分、遗迹
蓝桥杯2024年第十五届省赛真题-前缀总分 题目描述 给定 n 个由小写英文字母组成的字符串 s1, s2, , sn ,定义前缀总分为V ∑i<j P(si, sj) ,其中 P(si, sj) 表示 si, sj 的最长公共前缀的长度。 小蓝可以选择其中一个字符串,并修改其…...
性能比拼: MySQL vs PostgreSQL
本内容是对知名性能评测博主 Anton Putra MySQL vs PostgreSQL Performance Benchmark (Latency - Throughput - Saturation) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 MySQL vs PostgreSQL 数据库性能对比** 在本内容中,我们将对比 MySQL 和 Pos…...
TypeScript 中的 infer 关键字用途
infer 是 TypeScript 中的高级类型关键字,主要用于条件类型中推断类型。它允许我们在条件类型的 extends 子句中声明一个类型变量,然后在该条件类型的 true 分支中使用这个推断出的类型。 1. 基本语法 type SomeType<T> T extends infer U ? U…...
关于Spring MVC中@RequestParam注解的详细说明,用于在前后端参数名称不一致时实现参数映射。包含代码示例和总结表格
以下是关于Spring MVC中RequestParam注解的详细说明,用于在前后端参数名称不一致时实现参数映射。包含代码示例和总结表格: 1. 核心作用 RequestParam用于显式绑定HTTP请求参数到方法参数,支持以下场景: 参数名不一致࿱…...
Spring Boot中Spring MVC相关配置的详细描述及表格总结
以下是Spring Boot中Spring MVC相关配置的详细描述及表格总结: Spring MVC 配置项详解 1. 异步请求配置 spring.mvc.async.request-timeout 描述:设置异步请求的超时时间(单位:毫秒)。默认值:未设置&…...
Shell脚本编程之正则表达式
一、概念 在 Shell 脚本中,正则表达式是一种强大且常用的文本处理工具,它可以用来匹配、搜索、替换和截取字符串。 正则表达式是由一些字符去描述规则,在正则表达式中有两类字符 (1)元字符(Meta Character):Shell 环境中具有特殊含…...
spring-ai-openai调用Xinference1.4.1报错
1、Xinference 报错logs 此处是调用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …...
XC7K160T-2FFG676I Kintex‑7系列 Xilinx 赛灵思 FPGA 详细技术规格
XC7K160T-1FFG676I XC7K160T-1FFG676C XC7K160T-2FFG676C 1. 基本概述 XC7K160T-2FFG676I 属于 Xilinx Kintex‑7 系列 FPGA,该系列芯片采用 28nm (HKMG)工艺制造,旨在提供高性能与低功耗的平衡。该芯片主要面向对高速数据处理、…...
C++学习之udp通信
1.UDP特点 c /* udp 传输层协议, 和tcp是一样的 特点: 面向无连接的, 不安全的, 报式传输协议 1. 无连接: udp通信的时候不需要connect 1). 通信不需要建立连接 2). 如果想给对方发送数据, 只需要指定对方的IP和端口 2. udp会丢包 1). 数…...
2020年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2020年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
【数据标准】数据标准化实施流程与方法-保障机制篇
导读:1、数据标准化保障机制(组织架构、协作流程)是战略落地的基石,确保责权分明与资源协同;2、数据标准化制度建设(政策、标准、工具)构建了统一治理框架,规范数据…...
ZLMediaKit部署与配置
ZLMediaKit编译 # 安装编译器 sudo apt install build-essential cmake# 其它依赖库 sudo apt-get install libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git cd /usr/local/srcgit clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit.git cd ZLMediaKit# …...
38、web前端开发之Vue3保姆教程(二)
三、Vue3语法详解 1、组件 1 什么是组件? 组件是 Vue.js 中最重要的概念之一。它是一种可复用的 Vue 实例,允许我们将 UI 拆分为独立的、可复用的部分。组件可以提高代码的组织性和可维护性。 2 创建组件 在 Vue 3 中,组件通常使用单文件组件(SFC)编写,其包含三个主…...
知识中台如何重构企业信息生态?关键要素解析
在信息化快速发展的时代,企业面临着如何高效整合和管理知识资源的挑战。知识中台作为企业信息管理的核心工具,正在帮助企业提升运营效率和创新力。本文将探讨知识中台如何重构企业信息生态,并解析其关键要素。 一、什么是知识中台?…...
蓝桥杯python组备赛(记录个人模板)
文章目录 栈队列堆递归装饰器并查集树状数组线段树最近公共祖先LCAST表字典树KMPmanacher跳表(代替C STL的set)dijkstra总结 栈 用list代替 队列 用deque双端队列替代 堆 用heapq 递归装饰器 众所周知,python的递归深度只有1000,根本满足不了大部…...
C++的多态 - 下
目录 多态的原理 虚函数表 1.计算包含虚函数类的大小 2.虚函数表介绍 多态底层原理 1.父类引用调用 2.父类指针调用 3.动态绑定与静态绑定 单继承和多继承关系的虚函数表 函数指针 1.函数指针变量 (1)函数指针变量创建 (2)函数指针变量的使用 (3)两段有趣的代码 …...
XSS(跨站脚本攻击)
什么是 XSS 攻击? XSS 攻击(Cross-Site Scripting)是一种常见的网络攻击手段,攻击者通过在网站上注入恶意的 JavaScript 代码,让网站在用户的浏览器中执行这些恶意代码,进而达到 窃取信息、篡改网页内容 或…...
LLM Agents的历史、现状与未来趋势
引言 大型语言模型(Large Language Model, LLM)近年在人工智能领域掀起革命,它们具备了出色的语言理解与生成能力。然而,单纯的LLM更像是被动的“回答者”,只能根据输入给出回复。为了让LLM真正“行动”起来ÿ…...