Semaphore是一个计数信号量。Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待(可以设置等待时长),而 release() 释放一个许可。
Semaphore实现的功能:比如我们去餐馆吃饭,如果该餐馆总共有十张桌子,但是吃饭的人有20波,那么先来的就占用了桌子吃饭,后来的只能等待,当任何一张桌子的人走开,那么其他等待的10波人就随机有1波人占用这张桌子,当然也可能按照顺序来,主要看采用FairSync还是NonfairSync。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。
网上找的构造方法和方法的说明:
构造方法摘要 | |
---|---|
Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore 。 | |
Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore 。 |
方法摘要 | |
---|---|
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) 如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。 |