大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实,最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈
前言
Semaphore的官方注释如下。
计数信号量。从概念上讲,信号量维护一组许可证(permits)。通常,每次调用
Semaphore#acquire方法时如果已经没有许可证,则会阻塞线程,直到获取到许可证。每次调用Semaphore#release方法都会添加一个许可证,此时某个阻塞的线程就会拿到许可证并解除阻塞状态。
Semaphore在初始化时需要指定许可证数,Semaphore#acquire方法会尝试获取一定数量的许可证,若许可证数量不足,则当前线程进入阻塞状态。相应地,获取到了许可证的线程,在执行完毕后,需要调用Semaphore#release方法来归还许可证。有以下两点需要注意。
- 建议在
finally代码块中调用Semaphore#release方法,确保许可证的归还; - 没有拿到许可证的线程,也可以调用
Semaphore#release方法。故需要在业务代码层面保证Semaphore的正确使用。
正文
一. api整理
Semaphore的常用api如下表所示。
api |
说明 |
|---|---|
Semaphore(int permits) |
构造函数。permits指定初始许可证的数量,此时Semaphore的工作方式是非公平锁的方式 |
Semaphore(int permits, boolean fair) |
构造函数。permits指定初始许可证的数量,fair指定Semaphore是公平锁还是非公平锁的工作方式 |
void acquire() |
获取许可证。默认获取1张许可证,获取失败则当前线程进入阻塞状态,且响应中断 |
void acquire(int permits) |
获取许可证。permits指定需要获取的许可证数量,获取失败则当前线程进入阻塞状态,且响应中断 |
void release() |
归还许可证。默认归还1张许可证 |
void release(int permits) |
归还许可证。permits指定归还许可证的数量 |
boolean tryAcquire() |
尝试获取许可证。获取成功返回true,获取失败返回false。就算Semaphore的工作方式是公平锁方式,但是该方法在被调用的那一刻,也是会以非公平锁的方式尝试去获取许可证 |
boolean tryAcquire(long timeout, TimeUnit unit) |
尝试在一段时间内获取许可证。获取成功返回true,获取失败返回false。该方法会尝试获取许可证,如果没有许可证,则等待timeout的时间,等待期间响应中断,如果等待时间到,也没有获取到许可证,则返回false |
有一点需要注意,就是无论Semaphore是公平锁还是非公平锁的工作方式,tryAcquire()方法会在调用的那一刻,以非公平锁的方式(就是不管是否已经有其它线程正在等待获取许可证)去获取许可证。如果想要tryAcquire()方法以公平锁的方式去获取许可证,则方法如下。
- 将
Semaphore设置为公平锁的工作方式; - 调用
tryAcquire(0, TimeUnit.SECONDS)方法。
二. 公平锁方式的Semaphore的简单使用
公平锁方式的Semaphore能够保证在没有许可证时,最先等待获取许可证的线程一定能够在有许可证时最先获取到许可证。示例如下所示。
public class SemaphoreTest {
@Test
public void 公平锁方式的简单使用(

Semaphore是一个计数信号量,用于控制同时访问特定资源的线程数量。它可以用于实现并发控制,如限制并发线程数。文章介绍了Semaphore的公平锁和非公平锁工作模式,acquire和release方法的使用,以及tryAcquire方法的特点。示例代码展示了公平锁和非公平锁方式的Semaphore如何工作。

5160

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



