Semaphore是Java中用于控制并发访问数量的同步工具,通过许可机制限制同时访问资源的线程数。创建时指定许可数量,线程需调用acquire()获取许可、release()释放许可,未获许可的线程将阻塞等待。支持公平与非公平模式,常用于限流、连接池管理等场景,能有效提升系统稳定性。

在Java多线程编程中,控制并发访问数量是保障系统稳定性的关键。Semaphore(信号量)正是为此设计的同步工具,它能有效限制同时访问某一资源的线程数量,常用于实现限流、资源池管理等场景。
Semaphore是java.util.concurrent包中的一个同步器,通过维护一组许可证(permits)来控制对资源的访问。线程在访问资源前必须先获取许可,访问完成后释放许可。若没有可用许可,线程将被阻塞直到有其他线程释放许可。
例如:设置一个最多允许3个线程并发执行的临界区,就可以初始化一个permit数量为3的Semaphore。
创建Semaphore时指定许可数量,调用acquire()获取许可,release()释放许可。这两个方法会自动处理线程阻塞与唤醒。
立即学习“Java免费学习笔记(深入)”;
示例代码:
模拟数据库连接池限制
假设我们只有3个数据库连接,但有10个线程竞争使用:
import java.util.concurrent.Semaphore;
public class DBConnectionExample {
// 最多3个连接
private static final Semaphore semaphore = new Semaphore(3);
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 尝试获取连接...");
semaphore.acquire(); // 获取许可
System.out.println(Thread.currentThread().getName() + " 已获得连接,正在操作数据库");
// 模拟数据库操作耗时
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " 释放连接");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release(); // 释放许可
}
}, "Thread-" + i).start();
}
}
}
运行结果中可以看到,每次只有3个线程能进入执行状态,其余线程等待,直到有线程释放许可。
Semaphore支持公平和非公平两种模式:
公平模式可避免线程饥饿,但吞吐量略低;非公平模式效率更高,但可能某些线程长时间得不到许可。
Semaphore适用于多种资源受限的并发控制:
注意:Semaphore不保证互斥访问(那是synchronized或ReentrantLock的职责),而是控制并发度。
基本上就这些。合理使用Semaphore可以在不修改业务逻辑的前提下,快速实现并发控制,提升系统稳定性。关键是根据资源容量设置合适的许可数量,并确保每次acquire后都有对应的release调用。
以上就是Java如何使用Semaphore控制并发数量_Java信号量机制与资源限制示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号