JDK 24里程碑:虚拟线程重大升级,要用虚拟线程请务必用JDK24

JDK 24里程碑:虚拟线程重大升级,要用虚拟线程请务必用JDK24
🧑 博主简介ZEEKLOG博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程高并发设计分布式系统架构设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图


文章目录

JDK 24里程碑:虚拟线程重大升级,要用虚拟线程请务必用JDK24

在这里插入图片描述

摘要

JDK 21引入的虚拟线程(Virtual Threads)革新了Java的并发编程模型,但其与最常用的同步机制synchronized之间存在一个关键冲突:线程固定(Pinning)。JDK 24通过的JEP 491提案从根本上解决了这一问题。

本文将通过时序图、流程图和代码示例,深入解析JDK 24如何重构synchronized的底层实现,使虚拟线程能够在不绑定平台线程的情况下安全地使用内置锁,从而释放虚拟线程的全部潜力。


一、 问题根源:虚拟线程与synchronized的先天冲突

要理解JDK 24的优化,首先必须清晰地定义问题所在。

1.1 虚拟线程的调度模型

虚拟线程的核心优势在于其高效的阻塞-恢复机制。其理想的工作流程如下:

虚拟线程VT-1载体线程CT-1操作系统/硬件VT-1挂载到CT-1并执行执行CPU计算发起阻塞式I/O请求(如读网络)I/O等待JVM卸载VT-1CT-1被释放,可执行其他VTI/O数据就绪JVM将VT-1挂载到CT-1(或CT-2)上继续执行后续代码虚拟线程VT-1载体线程CT-1操作系统/硬件

关键在于步骤4:当虚拟线程因I/O阻塞时,其载体线程(平台线程)会被立即释放。

1.2 synchronized 的固有壁垒

然而,synchronized关键字的语义是基于监视器锁(Monitor Lock) 的,而在JDK 24之前,这个锁的持有者是平台线程

考虑以下代码:

publicclassProblematicSync{privatefinalObject lock =newObject();publicvoidmethod(){synchronized(lock){// 平台线程在此获取监视器锁// 一些计算...readFromSocket();// 阻塞的I/O操作!// 更多计算...}}privatevoidreadFromSocket()throwsIOException{...}}

在JDK 21-23中,当虚拟线程执行上述方法时,会发生以下情况:

虚拟线程VT-1载体线程CT-1监视器锁 (lock)VT-1挂载到CT-1CT-1成功获取锁VT-1在同步块内执行调用readFromSocket(),发生I/O阻塞致命点:锁由CT-1持有JVM无法卸载VT-1!因为CT-1持有锁,它必须被“固定”(Pinned)。CT-1被阻塞,无法执行其他任务loop[空闲等待]I/O完成CT-1恢复执行VT-1继续执行同步块...CT-1释放锁虚拟线程VT-1载体线程CT-1监视器锁 (lock)

这种线程固定(Pinning) 现象使得一个宝贵的平台线程在虚拟线程被阻塞时完全闲置,与虚拟线程的设计目标背道而驰,严重制约了系统吞吐量。

为什么不能简单地让虚拟线程带着锁卸载?
因为这会引发极其复杂的线程所有权和内存可见性问题。如果VT-1在持有锁时被卸载,当它在另一个平台线程CT-2上恢复并释放锁时,JVM需要确保锁状态的一致性,这在旧的实现中几乎无法安全完成。


二、 JDK 24的解决方案:JEP 491详解

JEP 491: Synchronize Virtual Threads without Pinning 的目标是修改JVM,使虚拟线程能够在不固定平台线程的情况下使用synchronized

2.1 核心思想:锁所有权从平台线程转移到虚拟线程

JDK 24最根本的变革是:将监视器锁的持有者身份从“平台线程”提升为“虚拟线程”

现在,当虚拟线程进入synchronized块时,是虚拟线程本身被记录为锁的拥有者,而不是它当时恰好运行在之上的那个平台线程。

2.2 优化后的工作流程

让我们用同样的代码示例,看看在JDK 24中会发生什么:

publicclassFixedSync{privatefinalObject lock =newObject();publicvoidmethod(){synchronized(lock){// 虚拟线程VT-1本身获取锁readFromSocket();// 阻塞的I/O操作}}}

其执行流程如下图所示:

虚拟线程VT-1载体线程CT-1监视器锁 (lock)载体线程CT-2VT-1挂载到CT-1VT-1成功获取锁(锁所有者是VT-1)VT-1在同步块内执行调用readFromSocket(),发生I/O阻塞关键点:锁由VT-1持有,与CT-1无关。JVM安全地卸载VT-1CT-1被释放!CT-1去执行其他虚拟线程(如VT-2)I/O完成VT-1进入就绪队列JVM将VT-1挂载到空闲的CT-2上VT-1在CT-2上恢复执行由于它是锁所有者,直接继续执行同步块VT-1释放锁虚拟线程VT-1载体线程CT-1监视器锁 (lock)载体线程CT-2

这个流程清晰地展示了优化带来的巨大好处:

  1. 无固定(No Pinning):在I/O阻塞期间,载体线程CT-1被释放。
  2. 锁语义不变:锁的互斥性得到完全保证。在VT-1持有锁的整个期间,任何其他线程(虚拟或平台)都无法进入该同步块。
  3. 透明度高:开发者无需修改任何代码,即可享受性能提升。
2.3 技术实现浅析

JEP 491没有规定具体的实现方式,但可以推测JVM团队需要对对象头中的锁标记、锁记录等底层数据结构进行调整,以支持“虚拟线程作为锁所有者”这一新概念。这涉及到JVM中最复杂和敏感的部分,其改动是深远的。


三、 代码示例与影响分析

3.1 性能对比演示

以下是一个简单的演示,用于对比优化前后的差异。由于我们无法模拟JVM底层实现,此代码主要用于示意逻辑。

importjava.util.concurrent.Executors;importjava.util.stream.IntStream;publicclassSynchronizedVirtualThreadDemo{privatefinalObject lock =newObject();privateint counter =0;// 一个在同步块内包含模拟I/O的方法publicvoidsynchronizedOperation(String taskId){synchronized(lock){System.out.println(Thread.currentThread()+" - Task "+ taskId +" started."); counter++;// 模拟一个阻塞操作(如数据库查询、网络调用)simulateBlockingIO();System.out.println(Thread.currentThread()+" - Task "+ taskId +" finished. Counter: "+ counter);}}privatevoidsimulateBlockingIO(){try{// 休眠模拟I/O阻塞Thread.sleep(1000);}catch(InterruptedException e){Thread.currentThread().interrupt();}}publicstaticvoidmain(String[] args)throwsInterruptedException{var demo =newSynchronizedVirtualThreadDemo();long startTime =System.currentTimeMillis();try(var executor =Executors.newVirtualThreadPerTaskExecutor()){// 提交100个任务var futures =IntStream.range(0,100).mapToObj(i -> executor.submit(()-> demo.synchronizedOperation("T"+ i))).toList();// 等待所有任务完成for(var future : futures){ future.get();}}catch(Exception e){ e.printStackTrace();}long duration =System.currentTimeMillis()- startTime;System.out.println("Total time: "+ duration +" ms");}}

在JDK 21-23下的可能结果:
由于线程固定,每个任务都会在持有锁时固定一个平台线程。即使有大量虚拟线程,它们也会在锁外排队。执行时间会远大于1000毫秒,因为平台线程数量有限(默认为CPU核心数),任务只能串行化执行。

在JDK 24下的可能结果:
虚拟线程在synchronized块内阻塞时不会固定平台线程。当一个任务在锁内休眠时,它占用的平台线程会被释放去执行其他在锁外等待的任务。虽然锁的互斥性保证了counter的正确性,但平台线程的利用率极高。总执行时间会大幅缩短,接近 (1000ms * 任务批次数),呈现出极高的并发度。

3.2 对开发者的意义
  1. 简化决策:在JDK 24及以上版本中,可以更放心地使用synchronized。无需再仅仅因为虚拟线程而刻意将其替换为ReentrantLock
  2. 遵守最佳实践:应回归到锁选择的经典原则:优先使用synchronized,除非你需要ReentrantLock提供的超时、可中断、公平性等高级功能。
  3. 平滑迁移:为现有大量使用synchronized的代码库迁移到虚拟线程模型扫清了最大的障碍。

结论

JDK 24中对虚拟线程与synchronized协同工作的优化,是一次至关重要的底层修缮。它通过将锁的持有者从平台线程转移到虚拟线程,巧妙地解决了“线程固定”这一核心矛盾,使得虚拟线程的高效性与语言核心的同步机制得以完美结合。

这项改动看似透明,无需开发者干预,但其影响是深远的。它标志着Java并发编程在虚拟线程时代真正走向成熟,为构建下一代高吞吐、高可伸缩的Java应用奠定了坚实可靠的基础。对于开发者而言,这意味着我们可以更专注于业务逻辑的并发设计,而减少对底层同步机制选择的纠结,从而最大化地享受虚拟线程带来的技术红利。

Read more

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 多所高校要求警惕 OpenClaw 安全风险,部分严禁校内使用 * 荣耀 CEO 李健:荣耀机器人全栈自研,将聚焦消费市场 * 马化腾凌晨 2 点发声:还有一批龙虾系产品陆续赶来 * 前快手语言大模型中心负责人张富峥,已加入智源人工智能研究院,负责 LLM 方向 * 最新全球 AI 应用百强榜发布,豆包/DeepSeek/千问上榜 * 苹果折叠 iPhone 将于九月亮相,融合 iPhone 与 iPad 体验

By Ne0inhk
不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) “如果你周日去旧金山的咖啡馆,会发现几乎每个人都在工作。” 这是 AI 创业公司 Mythril 联合创始人 Sanju Lokuhitige 最近最直观的感受。去年 11 月,他特地搬到旧金山,只为了更接近 AI 创业浪潮的中心。但很快,他也被卷入了这股浪潮带来的另一面——一种越来越极端的工作文化。 Lokuhitige 坦言,他现在几乎每天工作 12 小时,每周 7 天。除了每周少数几场刻意安排的社交活动(主要是为了和创业者们建立联系),其余时间几乎都在写代码、做产品。 “有时候我整整一天都在编程,”他说,“我基本没有什么工作与生活的平衡。”而这样的生活,在如今的 AI 创业圈里并不算罕见。 旧金山 AI 创业圈的真实日常 一位在旧金山一家 AI

By Ne0inhk
黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

AI 究竟是什么?在 NVIDIA CEO 黄仁勋看来,它早已不只是聊天机器人或某个大模型,而是一种正在迅速成形的“新型基础设施”。 近日,黄仁勋在英伟达官网发布了一篇长文,提出一个颇具形象的比喻——AI 就像一块“五层蛋糕”。从最底层的能源,到芯片、基础设施、模型,再到最上层的应用,人工智能正在形成一整套完整的产业技术栈,并像电力和互联网一样,逐渐成为现代社会的底层能力。 这也是黄仁勋自 2016 年以来公开发表的第七篇长文。在这篇文章中,他从计算机发展史与第一性原理出发,试图解释 AI 技术栈为何会演化成如今的形态,以及为什么全球正在掀起一场规模空前的 AI 基础设施建设。 在他看来,过去几十年的软件大多是预先编写好的程序:人类设计好算法,计算机按指令执行,数据被结构化存储在数据库中,通过精确查询调用。而 AI 的出现打破了这一模式——计算机开始能够理解图像、文本和声音,并根据上下文实时生成答案、推理结果甚至新的内容。 正因为智能不再是预先写好的代码,而是实时生成的能力,支撑它运行的整个计算体系也必须被重新设计。

By Ne0inhk
猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去几年里,科技公司几乎都在同一件事上加速:让 AI 参与写代码。 从自动补全、自动生成函数,到直接修改系统配置,生成式 AI 已经逐渐走进真实生产环境。但最近发生在亚马逊的一连串事故,却给整个行业泼了一盆冷水——当 AI 开始真正参与生产环境开发时,事情可能远比想象复杂。 最近,多家媒体披露,本周二亚马逊内部紧急召开了一场工程“深度复盘(deep dive)”会议,专门讨论最近频繁出现的系统故障——其中,一个被反复提及的关键词是:AI 辅助代码。 一周 4 次严重事故,亚马逊内部紧急复盘 事情的起点,是最近一段时间亚马逊系统稳定性明显下降。 负责亚马逊网站技术架构的高级副总裁 Dave Treadwell 在一封内部邮件中坦言:“各位,正如大家可能已经知道的,最近网站及相关基础设施的可用性确实不太理想。” 为此,公司决定把原本每周例行举行的技术会议

By Ne0inhk