接口限流之 Semaphore 思考

业界成熟的方案有很多
Google开源工具包Guava提供的限流工具类RateLimiter
SpringCloud提供的@HystrixCommand注解
今天我主要是看一下jdk官方提供的Semaphore信号量

情景预热


Semaphore用来控制同时操作某个资源的操作数量。
Semaphore管理着permits,每当一个线程来获取许可时,permits数减 1 ,
当permits数小于0时,再来获取许可的资源就需要阻塞

简单上手


声明一份全局 Semaphore  变量
private static Semaphore semaphore = new Semaphore(10); 代表同一时刻最大访问的线程数
子线程 调用 semaphore.availablePermits() == 0 判断有可用令牌
子线程 调用 semaphore.acquire(); 获取令牌
子线程 执行业务逻辑
子线程 调用 semaphore.release(); 释放令牌

semaphore.acquire()


semaphore.acquire() 方法 公平锁先看队列有无正在排队的 有则当前线程需要排队
不需要排队则 CAS 减小 status 的值 成功则子程序直接返回执行自己业务代码
如果 status 值 减少到 0 了 表示 后面的线程需求排队处理了 下图是排队代码分析

在这里插入图片描述
semaphore.release()


子程序执行完业务代码最后通过 CAS 把当前的 state 值更新为state + 1 
执行成功然后unpark唤醒下一个线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值