Semaphore的使用详解

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

大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈


前言

Semaphore的官方注释如下。

计数信号量。从概念上讲,信号量维护一组许可证(permits)。通常,每次调用Semaphore#acquire方法时如果已经没有许可证,则会阻塞线程,直到获取到许可证。每次调用Semaphore#release方法都会添加一个许可证,此时某个阻塞的线程就会拿到许可证并解除阻塞状态。

Semaphore在初始化时需要指定许可证数,Semaphore#acquire方法会尝试获取一定数量的许可证,若许可证数量不足,则当前线程进入阻塞状态。相应地,获取到了许可证的线程,在执行完毕后,需要调用Semaphore#release方法来归还许可证。有以下两点需要注意。

  1. 建议在finally代码块中调用Semaphore#release方法,确保许可证的归还;
  2. 没有拿到许可证的线程,也可以调用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()方法以公平锁的方式去获取许可证,则方法如下。

  1. Semaphore设置为公平锁的工作方式;
  2. 调用tryAcquire(0, TimeUnit.SECONDS)方法。

二. 公平锁方式的Semaphore的简单使用

公平锁方式的Semaphore能够保证在没有许可证时,最先等待获取许可证的线程一定能够在有许可证时最先获取到许可证。示例如下所示。

public class SemaphoreTest {
   
   

    @Test
    public void 公平锁方式的简单使用(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏之沫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值