Java 中的 Semaphore(信号量)(java 信号量和锁的区别场景)
haoteby 2025-07-08 18:08 8 浏览
Semaphore 是 Java 并发包 ( java.util.concurrent ) 中的一个重要同步工具,用于控制对共享资源的并发访问线程数量。
基本概念
Semaphore(信号量)维护了一组许可证(permits),线程可以通过 Semaphore 来获取和释放许可证,从而控制对资源的访问。
核心特性
- 限制并发数:控制同时访问特定资源的线程数量
- 公平性选择:支持公平和非公平模式
- 可中断:支持可中断的获取操作
- 尝试获取:支持尝试获取和超时获取
基本用法
1. 创建 Semaphore
// 创建具有10个许可证的信号量(非公平模式)
Semaphore semaphore = new Semaphore(10);
// 创建具有10个许可证的信号量(公平模式)
Semaphore fairSemaphore = new Semaphore(10, true);
2. 获取许可证
// 获取一个许可证(阻塞直到获取到或线程被中断)
semaphore.acquire();
// 获取多个许可证
semaphore.acquire(3);
// 尝试获取许可证(非阻塞)
boolean acquired = semaphore.tryAcquire();
// 尝试获取许可证(带超时)
boolean acquired = semaphore.tryAcquire(1, TimeUnit.SECONDS);
3. 释放许可证
// 释放一个许可证
semaphore.release();
// 释放多个许可证
semaphore.release(3);
实际应用示例
1. 限制数据库连接池
public class ConnectionPool {
private final Semaphore semaphore;
private final List<Connection> connections;
public ConnectionPool(int poolSize) {
this.semaphore = new Semaphore(poolSize);
this.connections = Collections.synchronizedList(new ArrayList<>());
// 初始化连接池...
}
public Connection getConnection() throws InterruptedException {
semaphore.acquire();
return connections.remove(0);
}
public void releaseConnection(Connection conn) {
connections.add(conn);
semaphore.release();
}
}
2. 控制资源访问
// 限制同时只有5个线程可以访问某资源
Semaphore semaphore = new Semaphore(5);
void accessResource() throws InterruptedException {
semaphore.acquire();
try {
// 访问共享资源
} finally {
semaphore.release();
}
}
重要方法
方法 描述
acquire() 获取一个许可证,阻塞直到可用或线程被中断
acquire(int permits) 获取指定数量的许可证
acquireUninterruptibly() 不可中断地获取许可证
tryAcquire() 尝试获取许可证,立即返回成功或失败
tryAcquire(long timeout, TimeUnit unit) 尝试获取许可证,带超时
release() 释放一个许可证
release(int permits) 释放指定数量的许可证
availablePermits() 返回当前可用的许可证数量
drainPermits() 获取并返回所有立即可用的许可证
hasQueuedThreads() 查询是否有线程正在等待获取许可证
getQueueLength() 返回等待获取许可证的线程数
注意事项
- 许可证数量:创建时可以指定初始许可证数量,但实际数量可以超过初始值(通过 release() 增加)
- 公平性:公平模式下,线程按 FIFO 顺序获取许可证;非公平模式下可能插队
- 异常处理:acquire() 方法可能抛出 InterruptedException
- 释放次数:释放的许可证数量不必与获取的数量相同,但要小心不要过度释放
- 与锁的区别:Semaphore 可以允许多个线程访问,而锁通常只允许一个
底层实现
Semaphore 基于 AQS (
AbstractQueuedSynchronizer) 实现:
- 许可证数量对应 AQS 的状态值(state)
- 获取许可证相当于减少 state
- 释放许可证相当于增加 state
- 当 state ≤ 0 时,获取操作需要排队等待
Semaphore 是 Java 并发编程中非常有用的工具,特别适合资源池、限流等场景。
爱学习的小伙伴,更对精彩,关注不迷路哟~
相关推荐
- Python的RSA操作(私钥与公钥)(python rsa 公钥解密)
-
RSA是1977年由罗纳德·李维斯特(RonRivest)、阿迪·萨莫尔(AdiShamir)和伦纳德·阿德曼(LeonardAdleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA...
- RSA在日益互联的世界网络中安全性能如何?
-
KeyFactor公司(美国一家领先的安全数字身份管理解决方案提供商及网络安全行业权威机构)研究表明,许多物联网设备制造商正在生成不安全的RSA密钥,182个RSA证书里就有一个可能会被破解,由于不正...
- 让频谱分析更高效,澄清RSA使用中的一些误解
-
从事射频应用的研究人员、工程师和技术人员通常都能充分理解频谱分析仪的用途和优点,无论是传统的扫频分析仪(TSA)还是更现代的矢量信号分析仪(VSA)。他们熟练掌握这些重要射频仪器的关键规范和工作...
- 微软公告:Win10/Win11将不再支持短于2048位的RSA密钥证书
-
IT之家3月16日消息,微软近日发布公告,表示即将放弃短于2048位的RSA密钥证书。在公告中微软并未明确弃用时间,对于用户来说,这其实有利于构建更安全的上网环境。IT之家翻译微软公告...
- 目前已知的最强加密算法RSA(rsa加密算法的优点)
-
前面有人让我讲解一下RSA算法,今天我就用我所学的知识讲解一下,首先我们先了解一下RSARSA是一种非对称加密算法,1977年由罗纳德·李维斯特(RonRivest)、阿迪·萨莫尔(AdiSha...
- 韩国 CryptoLab 将在 2025年 RSA 大会发布加密人脸识别解决方案
-
据美通社4月23日报道,韩国同态加密网络安全企业CryptoLab宣布,将于4月24日在2025年RSA大会上,首次发布加密人脸识别(EFR)方案,为生物识别安全难题提供创新解法。当前,人脸识...
- 应对变化!盘点RSA2015十大热门产品
-
4月20日-24日,全球知名信息安全峰会RSAConference2015在美国旧金山召开。作为IT安全领域的权威科技大会,RSA大会不仅会邀请各地区著名安全专家出席与分享,更吸引汇集了全球众多顶...
- RSA 2015主题:变化挑战当今的安全理念
-
1“变化”成为RSA2015主题4月20日-24日,全球知名信息安全峰会RSAConference2015在美国旧金山召开。作为IT安全领域的权威科技大会,RSA大会不仅会邀请各地区著名安全专家出...
- 非对称加密——一文看懂RSA(非对称加密详解)
-
非对称加密----RSA的使用"非对称加密也叫公钥密码:使用公钥加密,使用私钥解密"在对称密码中,由于加密和解密的密钥是相同的,因此必须向接收者配送密钥。用于解密的密钥必须被配送给...
- RSA算法详解(rsa算法图解)
-
什么是RSA前面文章我们讲了AES算法,AES算法是一种是对称加密算法,本文我们来介绍一个十分常用的非对称加密算法RSA。非对称加密算法也叫公钥密码算法,通过生成的公私钥来对明文密文进行加密解密。R...
- 升级SSH后ssh-rsa失效?一文带你轻松解决!
-
背景今天刚给Linux桌面系统完成升级,结果SSH连接突然“罢工”了,还弹出了这个报错信息:...
- 历史回顾RSA大会:25年,十个瞬间(rsa conference)
-
国家安全局、Clipper芯片、苹果对决FBI、禁止ShowGirl——RSA大会都经历过。RSA需要你RSA这个词代表一家密码及安全厂商,也代表着世界上最大的网络安全展会,它今年在旧...
- RSA 加密技术详解(rsa的加密原理是什么)
-
RSA的安全性基于数学难题的理论安全:RSA的安全性主要基于大质数分解和离散对数问题这两个数学难题。在RSA加密算法中,公钥包含一个大整数N,它是两个大质数p和q的乘积。攻击者如果想要破解RSA加密,...
- 「游戏开发」请别再说Unity不如Unreal:Unity室内场景 + 光照练习 3
-
关注“indienova”,挖掘独立游戏的更多乐趣引言上两节慢吞吞的补了很多技术实现的细节,感觉要是把用到的所有技术细节都过一遍可能还需要若干篇文章。所以决定先把整体的流程这篇好玩的写了,以后再慢慢补...
- 再做一个Android!Google发布第二代VR眼镜Cardboard
-
在去年的GoogleI/O上,Google向所有与会者发放了一款名为Cardboard的纸盒版虚拟现实眼镜,相比OculusRift等颇为酷炫的VR头盔,第一代Cardboard着实糙得很。不过,...