在一个微服务里,用 Scoped Values 传递 traceId,发现上下文穿透变得如此简单——那一刻我觉得,Loom 的承诺终于完整了。
2025 年 9 月 16 日,JDK 25 正式发布。与之前的 JDK 22、23、24 不同,这是一个长期支持(LTS) 版本。这意味着它不仅是短期创新的集大成者,更是未来数年企业级应用的基石。它的每一个特性,都经过了反复打磨和验证。
JDK 25 的核心故事线非常清晰:Project Loom 的两大支柱——虚拟线程和 Scoped Values——终于在 LTS 中正式落地。这标志着 Java 的并发模型完成了一次历史性的升级。除此之外,一系列面向未来的安全、性能和语言特性,也让这个 LTS 版本显得格外厚重。
所有特性均基于 JSR 400(《Java SE 25 发布规范》)。作为一个承前启后的 LTS 版本,它主要聚焦:
这是 JDK 25 最重要的特性之一,也是 Project Loom 拼图的最后一块。长久以来,ThreadLocal 是我们在多线程间传递上下文(如用户身份、traceId)的主要工具。但它存在诸多问题:内存泄漏风险、在线程池中行为诡异、与虚拟线程的轻量模型格格不入。
Scoped Values 提供了一个优雅的替代方案:
try-with-scope),自动清理,无泄漏之忧。// 定义一个 Scoped Value
private static final ScopedValue<String> TRACE_ID = ScopedValue.newInstance();
// 在入口处绑定
ScopedValue.where(TRACE_ID, "trace-123")
.run(() -> {
// 在这个作用域内,任何地方都可以安全地获取 traceId
String id = TRACE_ID.get(); // "trace-123"
handleRequest();
});对于构建高可靠、可观测的分布式系统,Scoped Values 是一个游戏规则改变者。它让上下文管理从一个“麻烦事”变成了一个“自然流”。
自 Java 14 引入模式匹配以来,它极大地简化了类型检查和转换的代码。但在 JDK 25 之前,基本类型(int, double, boolean 等)始终被排除在外,必须先装箱成引用类型才能参与匹配,这既啰嗦又低效。
JDK 25 彻底解决了这个问题。现在,基本类型可以无缝地融入 instanceof 和 switch 表达式:
// JDK 25
Object obj = ...;
switch (obj) {
case int i -> System.out.println("Integer: " + i);
case double d -> System.out.println("Double: " + d);
case boolean b -> System.out.println("Boolean: " + b);
case String s -> System.out.println("String: " + s);
default -> System.out.println("Unknown");
}这不仅仅是语法上的便利,更是对 Java 类型系统的一次完善。它消除了基本类型和引用类型在模式语法上的割裂感,让代码逻辑更加连贯和高效。
随着网络安全威胁的不断演变,密钥派生(Key Derivation)已成为现代加密应用的核心环节。然而,Java 标准库此前缺乏一个统一、灵活的 API 来处理这一需求,开发者往往需要依赖第三方库或自己实现,增加了安全风险。
JDK 25 引入了全新的 javax.crypto.KDF API:
这对于需要安全存储密码、生成会话密钥或实现端到端加密的应用来说,是一个至关重要的基础设施升级。
JDK 25 通过 JSR 400,交出了一份沉甸甸的 LTS 答卷。它不仅是对过去几年短期版本创新成果的整合与固化,更是对未来 Java 开发生态的一次有力塑造。Scoped Values 的正式发布,宣告了现代化并发编程时代的真正到来;基本类型模式匹配的完善,则让日常编码体验变得更加流畅。再加上紧凑对象头带来的性能红利和 KDF API 奠定的安全基石,JDK 25 无愧为一个值得信赖、值得升级的长期支持版本。它再次证明,Java 的演进是一场既有宏大叙事,又有精微洞察的稳健长跑。
[1] JSR 400: Java SE 25 规范: https://www.jcp.org/en/jsr/detail?id=400
[2] OpenJDK JDK 25 官方页面: https://openjdk.org/projects/jdk/25/
[3] JEP 506: Scoped Values: https://openjdk.org/jeps/506
[4] JEP 507: Primitive Types in Patterns: https://openjdk.org/jeps/507
[5] JEP 510: Key Derivation Function API: https://openjdk.org/jeps/510