You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:01:02