一、semaphone 信号量
Semaphone (信号量)是一个同步工具类、用来控制同时访问某个资源的线程数量,还可以用来实现某些资源池、或者给容器添加边界。
Semaphone管理着一组“虚拟”的许可(permit),许可的初始数量可通过构造函数来指定。操作之前可以先获得许可,并在操作结束之后释放许可。
acquire方法需要消耗一个许可,如果没有许可acquire将阻塞直到有许可(除非被中断、或者超时)可用。release方法则会添加一个许可。这里的许可,是一个虚拟的概念,并不存在一个名为“Permit"的对象,Semaphore只是记录可用的许可数量并执行相应的操作。
这里有两点需要注意:
- release会创建一个许可添加到信号量中,Semaphore中的许可数量并不受限于初始值,也就是说可以在Semaphore构造函数之后,调用release(int)增加许可数量。
- 如果一个线程因为没有许可而阻塞,在等待过程中被中断,accquire方法会抛出InterruptedException异常,并且清除中断状态、
Semaphore主要方法
方法 | 说明 |
---|---|
void acquire() | 消耗一个许可,无许可可用则阻塞,直到许可可用或者线程被中断 |
void acquire(int) | 消耗多个许可,无足够许可则阻塞、直到有足够的许可可用或者被中断 |
void acquireUninterruptibly() | 消耗一个许可 ,无许可则阻塞,并且线程被中断时会继续等待, 当该方法返回时,线程中标志会重置 |
void acquireUninterruptibly(int) | 消耗多个许可 ,无许可则阻塞,并且线程被中断时会继续等待, 当该方法返回时,线程中标志会重置 |
boolean tryAcquire() | 尝试获取一个许可,该方法不会阻塞,有许可则立即返回true,无许可则立即返回false。 即使在公平模式 |