前言
Semaphore 是JDK1.5的 java.util.concurrent 并发包中提供的一个并发工具类。所谓 Semaphore 即 信号量 的意思。这个叫法并不能很好地表示它的作用,更形象的说法应该是 许可证管理器 。
Semaphore 是一个计数信号量。
- 从概念上将,
Semaphore包含一组许可证。 - 如果有需要的话,每个
acquire()方法都会阻塞,直到获取一个可用的许可证。 - 每个
release()方法都会释放持有许可证的线程,并且归还Semaphore一个可用的许可证。 - 实际上并没有真实的许可证对象供线程使用,
Semaphore只是对可用的数量进行管理维护。
Semaphore类结构
Semaphore 类结构如下:

其中Sync、FairSync、NonfairSync 是 Semaphore 的内部类。FairSync、NonfairSync 均继承自 Sync :
1 | // NonFair version |
Sync 继承自 AbstractQueuedSynchronizer 。
1 | abstract static class Sync extends AbstractQueuedSynchronizer { |
Semaphore 构造方法
构造方法分为两种,如下:
1 | // 创建具有给定的许可数和非公平模式的 Semaphore |
Semaphore 获取、释放许可的方法
获取、释放许可的方法分为两大类,如下:
1 | /** |
Semaphore的其他方法
其他方法包括获取当前可用许可数、获取队列正在等待许可的线程数目、是否是公平模式等,如下:
1 | // 返回此信号量中当前可用的许可数。 |
Semaphore的使用
Semaphore 经常用于限制获取某种资源的线程数量。
以请求总数为 6,并发执行的线程数为 2 为例:
1 | public class SemaphoreDemo { |
执行结果如下:
1 | 处理请求 0 前,当前许可证数量:0 |
当释放许可参数变成 2,即从 semaphore.release(1) 变成 semaphore.release(2)。执行结果如下:
1 | 处理请求 0 前,当前许可证数量:0 |