前言
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 |