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)如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。 |

Semaphore是一种用于控制同时访问特定资源的线程数量的同步工具。本文详细介绍了Semaphore的基本概念,构造方法及各种操作方法,如acquire、release等,以及如何使用Semaphore实现有限大小的链表和公平与非公平访问。
7万+

被折叠的 条评论
为什么被折叠?



