工具类Semaphore的实现分析

本文以技师服务为例,深入浅出地解析了Semaphore的工作原理及其应用场景。通过公平与非公平模式的对比,阐述了如何高效管理和限流有限资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        说起semaphor分析,停车场的例子都给说烂了,现在以技师服务为例进行分析,希望能给大家带来更深刻的理解。

         一个团队的技师资源是有限的,所以客人爆满时要进行限制。对于有限的资源要进行限流、控制,高效的提高技师工作效率,这就是semaphore的应用场景。

         具体实现流程如下图:

 

        semaphore基于AbstractQueuedSynchronizer模板实现公平限流模式、非公平限流模式,以AQS的state为管理员来实现资源控制,包括state的初始化、增加、减少。具体实现步骤如下:

  1. 初始化资源数据,比如state=100
  2. 客人提供(默认不公平)申请技师个数,管理员state进行把门,查看是否可用数〉申请数。
  3. 如果可用数〉=申请数
    1. 管理员分配permit,客人申请成功,技师开始工作…
    2. 客人爽完后归还permit给管理员,申请流程结束。
  4. 如果可用数<申请数
  1. 公平申请客人则去门口的申请队伍末尾排队。等排到第一个时才能提出申请并拿到permit。
  2. 不公平申请客人则无需排队,不停的集体提出permit申请,谁手快谁能抢到permit。
  3. 抢到permit的客人,管理员分配permit,客人申请成功,技师开始工作…
  4. 客人洗完脚后归还permit给管理员,申请流程结束。

本文为齐鲁大帝原创,转载请注明出处!

 

### 使用 RedissonClient 实现 Semaphore工具类 Redisson 提供了基于 Redis 的分布式信号量 `RSemaphore`,该对象实现了 Java 中的 `Semaphore` 接口。这使得可以轻松创建和管理分布式的信号量资源。 #### 创建并初始化 RedissonClient 为了使用 Redisson 功能,首先需要配置并启动一个 `RedissonClient` 实例: ```java import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class RedissonUtil { private static final Config config = new Config(); static { // 配置连接到单个 Redis 服务器或集群的方式 config.useSingleServer().setAddress("redis://127.0.0.1:6379"); // 初始化客户端 redissonClient = Redisson.create(config); } } ``` #### 构建 Semaphore 工具类 下面是一个简单的工具类示例,用于获取、释放以及尝试获得许可: ```java import org.redisson.api.RSemaphore; import org.redisson.api.RedissonClient; public class DistributedSemaphoreTool { private final RSemaphore semaphore; private final int permits; /** * 构造函数接收 Redisson 客户端实例和信号量名称作为参数 */ public DistributedSemaphoreTool(RedissonClient client, String name, int initialPermits) { this.semaphore = client.getSemaphore(name); this.permits = initialPermits; try { // 设置初始可用许可证数量 semaphore.trySetAvailablePermits(permits); } catch (Exception e){ System.err.println("Failed to set available permits."); } } /** * 获取指定数量的许可,默认为1 */ public boolean acquire(int numPermises) throws InterruptedException { return semaphore.acquire(numPermises); } /** * 尝试立即获取指定数量的许可而不阻塞 */ public boolean tryAcquire(int numPermises) { return semaphore.tryAcquire(numPermises); } /** * 释放指定数量的许可 */ public void release(int numPermises) { semaphore.release(numPermises); } } ``` 此代码片段展示了如何定义一个名为 `DistributedSemaphoreTool` 的工具类来封装对 `RSemaphore` API 的调用[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值