Semaphore通过许可机制控制并发线程数,如示例中3个许可限制最多3线程执行任务,acquire()获取许可,release()释放许可,确保资源安全访问。

在Java中,Semaphore 是一种用于控制同时访问特定资源的线程数量的同步工具。它通过维护一组许可(permits)来实现并发量的限制。线程在执行关键操作前需要获取许可,执行完成后释放许可,从而实现对并发量的精确控制。
理解Semaphore的基本原理
Semaphore 有两种模式:公平和非公平。默认是非公平模式,即不保证等待时间最长的线程优先获得许可。
主要方法包括:
- acquire():线程尝试获取一个许可,如果没有可用许可,则阻塞直到有许可被释放。
- acquire(int permits):一次获取多个许可。
- release():释放一个许可,将其归还给信号量。
- release(int permits):一次释放多个许可。
- tryAcquire():尝试获取许可,不会阻塞,立即返回是否成功。
使用Semaphore限制并发线程数
假设我们希望最多允许3个线程同时访问某个资源,可以通过以下方式实现:
立即学习“Java免费学习笔记(深入)”;
本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
// 定义一个拥有3个许可的Semaphore
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();
}
}
}
在这个例子中,尽管启动了10个线程,但最多只有3个线程能同时执行任务,其余线程会等待前面的线程释放许可后才能继续。
应用场景与注意事项
Semaphore常用于以下场景:
- 数据库连接池的连接数控制
- 限制对昂贵资源的并发访问(如文件读写、网络请求)
- 模拟资源池行为
需要注意的是:
- 确保每次 acquire() 都对应一个 release(),通常放在 finally 块中,防止死锁或资源泄露。
- 如果不需要阻塞等待,可以使用 tryAcquire() 配合超时机制。
- Semaphore 不依赖对象监视器,可灵活用于不同线程间的协调。









