Skip to content

你使用过哪些 Java 并发工具类? ​

  • 标签:Java并发、Java

🏛 业务架构师 ​

我按使用频率讲实战中最常用的:

  • CountDownLatch:并行扇出后聚合——详情页同时调商品、库存、优惠券三个服务,三个任务 countDown,主线程 await 等齐。串行 600ms 变并行 200ms,直接写进 P99 优化报告。注意不可重置,一次性场景;
  • CompletableFuture:异步编排主力——thenCompose 串联、allOf 聚合、exceptionally 降级,配自定义线程池。**"调 A、B 成功后调 C,任一失败走兜底"**这类业务流程用它声明式表达,替代回调地狱;
  • Semaphore:并发配额控制——昂贵第三方接口(按并发计费的风控、短信网关)限 10 个并发,保护配额就是保护成本;
  • CyclicBarrier:分片计算的同步栅栏(多线程分段统计、到齐汇总下一轮);
  • ReentrantReadWriteLock / StampedLock:读多写少的本地缓存(配置表、字典数据),读并行写互斥;
  • ConcurrentHashMap:一切并发共享 KV 的默认答案;
  • AtomicLong / LongAdder:计数场景——高并发热点计数用 LongAdder(分段累加),Atomic 的自旋在极端竞争下烧 CPU;
  • BlockingQueue:生产消费解耦的本地缓冲(日志异步刷盘、请求缓冲)。

我的两条使用纪律:

  1. 等待必须带超时(await(timeout)、tryAcquire(timeout))——挂死线程的排查成本远高于一行参数;
  2. 优先标准件,禁止手写 wait/notify——JUC 的正确性经过千锤百炼,自造轮子的并发 bug 都是隐藏资产(负资产)。

一句话:并发工具是业务模式的标准件库——扇出聚合、配额限流、读写分离,对号入座别自研。

🏗 系统架构师 ​

我按"协调控制、并发容器、原子类、同步工具"四类梳理实战用法:

  • 协调控制:CountDownLatch(等 N 个任务完成再继续——多源数据聚合后组装结果)、CyclicBarrier(N 个线程互相等齐再同时继续,可重用——并行分段计算汇合点)、Semaphore(限并发数:限制同时调第三方接口 10 并发)、Phaser(多阶段动态参与者)、Exchanger(两线程交换缓冲区);
  • 并发容器:ConcurrentHashMap(高并发缓存/计数场景)、CopyOnWriteArrayList(读极多写极少的监听器/规则表)、BlockingQueue 系列(生产者消费者:LinkedBlockingQueue 做任务队列、DelayQueue 做延迟任务、SynchronousQueue 做直接交接)、ConcurrentLinkedQueue(无锁高吞吐队列);
  • 原子类:AtomicLong/LongAdder(计数器,高竞争用 LongAdder 分段)、AtomicReference(CAS 更新状态引用、不可变快照替换)、AtomicStampedReference(防 ABA);
  • 锁与工具:ReentrantLock(tryLock 超时)、ReadWriteLock/StampedLock(读多写少,乐观读)、Condition(多条件队列)、LockSupport、CompletableFuture(异步编排:thenCombine/allOf 做并行调用聚合)。

我的典型落地:接口聚合(CompletableFuture.allOf + 自定义线程池 + 超时控制)、本地限流(Semaphore + Guava RateLimiter)、启动预热(CountDownLatch 等依赖就绪)、缓存快照原子替换(volatile + AtomicReference)。

💻 全栈开发专家 ​

我按"解决什么协作问题"分组,都是真实项目用过的:

同步协作类:

  • CountDownLatch:等待 N 个任务完成。我用于接口聚合——并行查 3 个下游,await(2, TimeUnit.SECONDS) 带超时防止慢依赖拖死接口;启动时预热多个缓存也用它。
  • CyclicBarrier:N 个线程互相等齐再一起继续(可重用)。并行分片计算(每线程算一段,到齐后合并)。
  • Phaser:更灵活的分阶段屏障,动态增减参与方,复杂分批任务用。

资源限流类:

  • Semaphore:限制并发数。我拿它保护慢接口:semaphore.tryAcquire() 失败直接降级,比线程池隔离更轻量。

数据交换类:

  • Exchanger:两线程交换数据, Genetic 算法/双向校验用得上(频率低)。

并发容器:

  • ConcurrentHashMap:并发缓存/计数映射;
  • CopyOnWriteArrayList:读多写极少(监听器列表、白名单);
  • BlockingQueue 系列:ArrayBlockingQueue 有界(生产消费背压)、DelayQueue(延迟任务)、LinkedBlockingQueue 链表无界慎用。

异步编排:

java
CompletableFuture.supplyAsync(() -> rpc1(), pool)
    .thenCombine(CompletableFuture.supplyAsync(() -> rpc2(), pool), (a, b) -> merge(a, b))
    .orTimeout(800, TimeUnit.MILLISECONDS)   // 超时兜底
    .exceptionally(e -> DEFAULT);            // 降级

CompletableFuture 是我日常用最多的——并行聚合、超时、降级一条龙,比手写 latch 干净得多。