JUC 并发工具全家桶:CountDownLatch、CyclicBarrier、Semaphore、CompletableFuture 与并发容器一网打尽

发布时间:2026/11/11 16:49:20
JUC 并发工具全家桶:CountDownLatch、CyclicBarrier、Semaphore、CompletableFuture 与并发容器一网打尽 文章收录专栏Java 核心原理全解源码・并发・面试实战系列文章Java 并发锁机制从底层原理到锁升级这一篇就够了深入理解 Java 内存模型JMM从抽象规范到生产实践衔接引子锁解决的是 “互斥”但并发里还有大量 “协作” 与 “共享数据” 的需求 —— 等一批任务完成、限制并发数、异步编排、线程安全容器。这一篇把 JUC 的工具层一次性讲透。1. wait/notify 与 LockSupport// wait/notify必须在 synchronized 内while 防虚假唤醒 synchronized (lock) { while (!ready) { lock.wait(); } } // 生产优先 notifyAllnotify 只随机唤醒一个易信号丢失 // LockSupport无需锁支持先 unpark 后 park中断只置标记不抛异常 LockSupport.park(); LockSupport.unpark(thread);2. 同步工具三兄弟工具一句话场景CountDownLatch等 N 个任务完成后再放行一次性CyclicBarrierN 个线程全部到达后同时放行可重置复用Semaphore控制并发数量限流 / 资源池CountDownLatch latch new CountDownLatch(3); IntStream.range(0,3).forEach(i - pool.execute(() - { work(i); latch.countDown(); })); latch.await(); // 阻塞等归零 Semaphore sem new Semaphore(3); // 最多 3 个并发 sem.acquire(); try { /* 临界资源 */ } finally { sem.release(); }其他浅谈Phaser 阶段器可动态增删线程Exchanger 两线程交换数据ForkJoinPool 分治 工作窃取适合 CPU 密集commonPool 默认线程数 CPU 核数 - 1IO 场景必须自定义。3. Future 与 CompletableFutureFuture 的局限get()阻塞、不能链式 / 回调。CompletableFuture 解决异步编排CompletableFuture.supplyAsync(() - queryDb()) // 异步执行 .thenApply(r - parse(r)) // 转换结果 .thenAccept(r - save(r)) // 消费 .exceptionally(ex - { log.error(失败, ex); return null; }); // 异常兜底 // 组合 CompletableFutureInteger f1 CompletableFuture.supplyAsync(() - 1); CompletableFutureInteger f2 CompletableFuture.supplyAsync(() - 2); f1.thenCombine(f2, (a, b) - a b).thenAccept(System.out::println);三个异常 API 的区别面试高频exceptionally仅异常时执行返回替代值handle成败都执行返回新阶段能拿到 result throwablewhenComplete成败都执行不改变结果只做副作用线程池坑默认 commonPool 是 JVM 全局共享IO 阻塞会耗尽影响整个应用非 Async 方法在调用线程执行IO 密集必须显式自定义线程池。4. 并发容器ConcurrentHashMapJDK7分段锁 Segment继承 ReentrantLock锁粒度 段JDK8放弃分段锁CAS synchronized锁桶头节点链表→红黑树链长≥8 转树sizeCtl 控制初始化 / 扩容扩容多线程协助ForwardingNodesize () 用 baseCount CounterCell非精确快照坑key/value 禁止 nullcomputeIfAbsent早期版本有递归问题高版本已修复CopyOnWriteArrayList/Set写时复制写加锁复制数组读无锁适合读多写极少写开销大、内存翻倍、迭代弱一致性BlockingQueue 家族队列特点ArrayBlockingQueue有界数组LinkedBlockingQueue可选有界默认无界、双锁SynchronousQueue不存元素直接传递DelayQueue无界延迟元素需 DelayedPriorityBlockingQueue无界优先生产选择有界队列配线程池无界有 OOM 风险。无锁队列ConcurrentLinkedQueueCAS 实现浅谈。5. 并发安全设计浅谈线程封闭栈封闭、ThreadLocal不可变对象String/BigIntegerfinal 安全发布线程安全单例饿汉 / 静态内部类 / 枚举 / 双重检查锁 volatile生产者 - 消费者BlockingQueue 一行实现BlockingQueueString queue new ArrayBlockingQueue(10); queue.put(任务); // 生产者满了阻塞 String task queue.take(); // 消费者空了阻塞6. 生产实践线程池隔离业务 / IO / 定时任务拆分线程池避免互相拖垮Tomcat 请求线程与业务线程池分离保护容器稳定。排查jstack -l pid、jcmd pid Thread.print、Arthasthread -b、JFR。金句速记锁管 “互斥”工具管 “协作”容器管 “共享数据”。一句话记工具Latch 等结果、Barrier 等齐人、Semaphore 限流量、CF 串异步一句话记容器CHM 加锁到桶、COW 读无锁、队列定边界。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询