寻求类似AtomicInteger/LongAddr的原子类:小于MAX时自增并返回操作结果
带上限的原子计数器实现方案
嘿,这个需求我太懂了——你要的就是一个带上限的原子计数器,既能保证并发安全,又能在当前计数没到最大值的时候允许自增,还得明确告诉你操作成没成,关键是绝对不能搞额外线程池破坏Jetty的单线程模型对吧?
其实不用找新工具,咱们可以基于AtomicInteger封装一个完全符合要求的实现,全程用CAS操作保证原子性,而且不需要任何额外线程:
public class BoundedConcurrentCounter { private final AtomicInteger currentCount = new AtomicInteger(0); private final int maxConcurrent; public BoundedConcurrentCounter(int maxConcurrent) { this.maxConcurrent = maxConcurrent; } /** * 尝试原子性自增:仅当当前计数小于max时执行自增 * @return 自增成功返回true,否则返回false */ public boolean tryIncrement() { while (true) { int current = currentCount.get(); // 先判断是否已达上限,直接返回失败 if (current >= maxConcurrent) { return false; } // CAS尝试更新,成功就返回true,失败就重试(因为其他线程可能修改了值) if (currentCount.compareAndSet(current, current + 1)) { return true; } } } /** * 原子性递减,释放计数槽位 * 必须在任务/请求处理完成后调用,无论成功失败 */ public void decrement() { currentCount.decrementAndGet(); } }
适配你的Jetty使用场景
- 初始化一个
BoundedConcurrentCounter,传入你的MAX并发数 - 当新网络请求过来时,先调用
tryIncrement():- 如果返回
true:说明当前并发数没到上限,把请求交给Jetty处理 - 如果返回
false:可以直接返回“服务繁忙”响应,或者做自定义排队逻辑
- 如果返回
- 等Jetty处理完请求后,一定要调用
decrement(),把计数减回去,不然槽位会一直被占用
为什么这个方案完全符合你的要求?
- 原子性保证:依赖
AtomicInteger的CAS操作,并发下不会出现计数错误 - 范围判断支持:每次尝试自增前都会检查当前值是否小于MAX,只有满足条件才执行自增
- 无额外线程:全程同步操作,没有启动任何Executor或线程,完美适配Jetty单线程驱动多请求的模型
- 明确返回结果:
tryIncrement()直接返回操作是否成功,正好匹配你“需要知道原子操作是否完成自增”的需求
重要注意点
- 务必调用
decrement():哪怕请求处理失败也要调用,否则会导致计数泄漏,最终所有新请求都被拒绝 - MAX值要合理设置:根据Jetty的处理能力和系统资源调整,避免过大导致资源耗尽
内容的提问来源于stack exchange,提问作者Gili
相关产品推荐
相关产品推荐

