

























Java并发编程的演进,是一场不断向下挖掘潜力,又不断向上构建抽象的历史。它反映了硬件从单核到多核的普及,也反映了开发者追求更简单、更高效编程模型的不懈努力。
下面,我将分阶段为你梳理这段发展历程。
该阶段代表了一个从无到有的过程,核心是利用操作系统提供的线程和锁能力,建立并发编程的雏形。
在 Java 1.0 时代,并发的基石是 Thread 类和 synchronized 关键字。Thread 类在底层直接映射到操作系统线程,带来了较高的创建和切换成本。synchronized 虽提供了互斥锁,但早期的粗粒度锁容易成为性能瓶颈。Object 类的 wait()/notify() 方法作为线程协作原语,也极其容易出错(如错过通知和虚假唤醒)。
到了 JDK 1.2,ThreadLocal 的引入提供了一种新思路——通过为每个线程创建独立的变量副本,避免了共享资源的竞争。
这个阶段,开发者只能基于这些原始工具,自行实现线程池和生产者-消费者队列等高级模式,代码不仅复杂,且极易出错。
java.util.concurrent(JUC)包诞生(JDK 5)JDK 5 引入 java.util.concurrent 包,就像启动了工业引擎,通过标准化的组件和线程池,将并发编程推向了现代。
这是并发编程史上真正意义的里程碑,由 Doug Lea 主导设计并引入的 java.util.concurrent(JUC)包,极大改变了开发模式。
ExecutorService 和 ThreadPoolExecutor 终结了开发者自行管理线程池的时代,提供了标准、高效的任务执行框架。CountDownLatch, CyclicBarrier, Semaphore 等同步器,为复杂的线程协调提供了现成的、可靠的方案。ConcurrentHashMap 等并发集合,通过精细化的锁机制(如分段锁)替代了笨重的 synchronized 包装,大幅提升了并发性能。AtomicInteger 等原子类,利用 CAS 操作实现了细粒度的无锁线程安全,减少了锁竞争的开销。Callable 和 Future 接口,让异步任务可以返回值并抛出受检异常,是对仅有 run() 方法的 Runnable 的强力补充。随着多核 CPU 普及,并发能力从通用场景进一步向高性能并行计算倾斜。
synchronized 的狂飙优化:这是为 synchronized 正名的关键版本。JVM 引入了 “偏向锁 → 轻量级锁 → 重量级锁” 的锁升级机制,使 synchronized 的性能在多数场景下不亚于 ReentrantLock,极大地降低了无竞争时的性能开销。ForkJoinPool,核心是 “工作窃取算法”,空闲线程能主动从繁忙线程的队列尾“偷”任务,专为高效解决可递归分解的并行任务而生,是 parallelStream 的底层基础。同时,Phaser 作为一种更灵活的同步屏障,支持动态增减参与者,非常适合分阶段、参与者数量不确定的任务。硬件性能不断挖掘,编程体验也迎来了“舒适区”的革新——Lambda、Stream 和 CompletableFuture 让代码更声明式、更异步。
CompletableFuture 改变世界:parallelStream 将函数式编程与并行结合,只需一行代码即可让集合处理并行化。CompletableFuture 则彻底改善了异步编程体验,它提供了 thenApply、thenCombine 等丰富的 API,解决了传统 Future 无法链式调用的痛点,帮助开发者摆脱“回调地狱”。java.util.concurrent.Flow 类中引入了响应式流的核心API(Publisher, Subscriber 等),为 JVM 上的响应式编程提供了标准接口。同时,CompletableFuture 也得到了增强,增加了 orTimeout、completeOnTimeout 等实用方法。并发发展迎来了革命性突破,通过虚拟线程颠覆了传统的“一任务一线程”模型。
这是 Java 并发模型近二十年来最具革命性的变革。传统的 Java 线程与操作系统线程 1:1 映射,一个线程动辄占用数 MB 内存,难以支撑百万级并发。
以 Project Loom 为基础的虚拟线程(Virtual Threads)改变了这一局面:
经过在 JDK 19 和 JDK 20 的预览,虚拟线程作为正式特性在 JDK 21 中推出。同时,JDK 21 还孵化(Incubator)了结构化并发 API(StructuredTaskScope),它将任务的生命周期绑定到代码块范围,旨在提升复杂并发场景的可观测性和健壮性,让线程的管理像 try-with-resources 一样优雅。
理解 Java 并发的发展史,也是理解并发哲学演变的过程:从共享可变的锁机制,逐渐向隔离与不可变演进。这种演变不仅是为了提升性能,也是为了从根本上简化复杂问题的处理,让我们能更聚焦于业务本身。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。