Java 并发编程的演进——从 synchronized 到 Loom 的虚拟线程

简介: Java并发编程经历了从低级同步原语到高级并发工具,再到革命性虚拟线程的漫长演进。

Java并发编程经历了从低级同步原语到高级并发工具,再到革命性虚拟线程的漫长演进。每个阶段都在解决前一阶段的痛点,同时引入新的抽象层次。理解这条演进路线,对于编写正确、高性能的并发程序至关重要。
参考:https://qfcrz.cn/category/smart-control.html

Java1.0-1.4的原始时代:早期的并发支持只有synchronized关键字、Object.wait/notify、以及Thread类。synchronized提供互斥,但粗粒度锁导致性能低下。wait/notify容易出错(错过通知、虚假唤醒)。Thread直接映射到操作系统线程,创建和销毁成本高昂。

这个时代的典型模式是线程池(自己实现)和生产者-消费者队列。ThreadLocal提供了线程局部变量,但容易内存泄漏(忘记remove)。

Java5的java.util.concurrent革命:Java5引入了java.util.concurrent包,这是并发编程的里程碑。ExecutorService和ThreadPoolExecutor标准化了线程池管理。Callable和Future支持有返回值的任务。BlockingQueue简化了生产者-消费者模式。ConcurrentHashMap提供高并发哈希表。CountDownLatch、CyclicBarrier、Semaphore等同步器覆盖了常见场景。AtomicXXX类提供了无锁的原子操作。

Java5的并发工具使开发者无需重复造轮子,大幅降低了并发编程的门槛。

Java7的Fork/Join框架:Java7引入了ForkJoinPool,专门用于分治任务(如递归算法、并行计算)。RecursiveTask和RecursiveAction实现分治逻辑,ForkJoinPool使用工作窃取算法——空闲线程从其他线程的队列尾部窃取任务,保持CPU忙碌。Fork/Join是Java8并行流的基础。

Java8的并行流和CompletableFuture:并行流(parallelStream)将集合操作自动并行化,开发者无需手动管理线程。CompletableFuture是Future的增强,支持回调链、组合操作、异常处理。thenApply、thenCompose、thenCombine等方法使异步编程更加声明式。CompletableFuture填补了Java在异步编程方面的空白,与反应式编程(RxJava、ProjectReactor)形成竞争。
参考:https://aescc.cn/category/balcony.html

Java9-11的细微改进:Java9引入了CompletableFuture的超时和延迟执行方法(orTimeout、completeOnTimeout)。Flow类实现了响应式流规范(ReactiveStreams),但使用较少。Java11主要稳定现有功能,没有重大并发特性。

Java19-21的虚拟线程革命:ProjectLoom引入的虚拟线程是Java并发最大的变革。虚拟线程是JVM管理的轻量级线程,不直接映射到操作系统线程。数百万个虚拟线程可以在少量操作系统线程上运行。当虚拟线程执行阻塞操作时,它会从载体线程上卸载,载体线程切换到其他虚拟线程,阻塞不占用操作系统线程资源。

虚拟线程彻底改变了Java的并发编程模型。开发者可以回到“一个请求一个线程”的简单模型,在需要I/O时直接阻塞,无需复杂的异步回调。虚拟线程的创建和切换成本比平台线程低数千倍,使百万并发成为现实。

虚拟线程的API与传统线程几乎相同:Thread.startVirtualThread或Executors.newVirtualThreadPerTaskExecutor()。现有代码通常只需替换Executors.newCachedThreadPool为虚拟线程执行器即可获得性能提升。

虚拟线程不是银弹。它最适合I/O密集型应用,对于CPU密集型任务,平台线程仍然更合适。虚拟线程中的synchronized会导致载体线程被固定(pinned),应尽可能使用ReentrantLock替代。ThreadLocal在虚拟线程中需要谨慎使用,因为大量虚拟线程可能耗尽内存。
参考:https://wkmsa.cn/category/sleep-environment.html

结构化并发(Java21预览)是虚拟线程的配套特性。StructuredTaskScope将并发任务组织为树状结构,子任务的生命周期不会超出父任务的范围。结构化并发自动处理取消和错误传播,防止线程泄漏。它是并发编程的范式转变,使代码更易推理和调试。

作用域值(Java20孵化,Java21预览)是ThreadLocal的替代方案。作用域值是不可变的,只能在限定的作用域内设置,在线程间传递。与ThreadLocal不同,作用域值不会在虚拟线程数量巨大时导致内存泄漏,且传递效率更高。

并发编程的最佳实践演进:从直接使用Thread到使用ExecutorService,再到使用CompletableFuture,再到虚拟线程,抽象层次不断提高。不变的是:避免共享可变状态,优先使用不可变对象,使用高级并发工具而非原始同步,以及充分测试并发代码(JCStress等工具)。

Java并发编程的未来是虚拟线程主导的。它将简化并发代码,提高I/O密集型应用的吞吐量,同时保持与现有生态的兼容性。开发者应该开始学习虚拟线程,准备在Java21+环境中采用。
参考:https://qfcrz.cn

目录
相关文章
|
14天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34762 38
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
8天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
8784 26
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
3天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
1744 17
|
25天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45659 155
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
8天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
1549 5
|
15天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
5642 24
|
3天前
|
云安全 人工智能 供应链
|
5天前
|
IDE Java 编译器
【全网最详细】JDK17下载安装图文教程 | Java17编程环境搭建步骤详解
JDK 17是Java官方长期支持(LTS)版本,提供编译、调试、运行Java程序的完整工具链。具备高稳定性、强安全性及现代语言特性(如密封类、模式匹配),广泛用于企业开发、教学入门与生产环境,是学习和实践Java的首选基础工具。(239字)