个人学习笔记,如有错误欢迎指正。。
信号量Semaphore ,一般用于限制对某些资源固定数量的访问。
Semaphore维护了N个的许可,某线程通过acquire()获取一个许可或acquire(int permits) 获取多许可,如果许可数量N大于线程要求的许可数,线程得到许可并可以继续执行。
否则线程阻塞,等待某线程释放许可。
某线程释放许可,许可数量增加并唤醒被阻塞的线程,阻塞线程唤醒后再试着获取许可,获取成功则继续执行否则再次阻塞。
Semaphore内部使用AbstractQueuedSynchronizer
方法:
void | acquire() 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被 中断 。 |
void | acquire(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,否则线程是 已中断的 。 |
void | acquireUninterruptibly() 从此信号量中获取许可,在有可用的许可前将其阻塞。 |
void | acquireUninterruptibly(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。 |
int | availablePermits() 返回此信号量中当前可用的许可数。 |
int | drainPermits() 获取并返回立即可用的所有许可。 |
protected Collection<Thread> | getQueuedThreads() 返回一个 collection,包含可能等待获取的线程。 |
int | getQueueLength() 返回正在等待获取的线程的估计数目。 |
boolean | hasQueuedThreads() 查询是否有线程正在等待获取。 |
boolean | isFair() 如果此信号量的公平设置为 true,则返回 true。 |
protected void | reducePermits(int reduction) 根据指定的缩减量减小可用许可的数目。 |
void | release() 释放一个许可,将其返回给信号量。 |
void | release(int permits) 释放给定数目的许可,将其返回到信号量。 |
String | toString() 返回标识此信号量的字符串,以及信号量的状态。 |
boolean | tryAcquire() 仅在调用时此信号量存在一个可用许可,才从信号量获取许可。 |
boolean | tryAcquire(int permits) 仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。 |
boolean | tryAcquire(int permits, long timeout, TimeUnit unit) 如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被 中断 ,则从此信号量获取给定数目的许可。 |
boolean | tryAcquire(long timeout, TimeUnit unit) 如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被 中断 ,则从此信号量获取一个许可。 |