Java 21 新特性解析

4 阅读4分钟

Java 21 新特性解析:虚拟线程与模式匹配

——关于 JDK 21 几个核心特性的客观分享

一、背景

Java 21 作为 Oracle 发布的长期支持版本(LTS),已经推出也有一段时间了。近期团队在做技术选型时,我花时间梳理了一下这个版本的几项核心特性,今天来分享一些个人的理解。

先说基本信息:

  • 发布时间:2023 年 9 月
  • 版本定位:LTS(长期支持)
  • 重要特性:虚拟线程、模式匹配、序列化集合等

二、虚拟线程(Virtual Threads)

是什么

虚拟线程是 Java 21 最受关注的新特性。它是 JDK 引入的一种轻量级线程实现,与传统的平台线程不同,虚拟线程不绑定固定的 OS 线程,而是由 JVM 在运行时动态管理。

基本用法

// 传统方式创建线程
Thread thread = new Thread(() -> {
    // 任务逻辑
});
thread.start();

// 虚拟线程方式
Thread virtualThread = Thread.ofVirtual().start(() -> {
    // 任务逻辑
});

或者使用线程池:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> {
        // 任务逻辑
    });
}

适用场景

从官方文档和社区反馈来看,虚拟线程特别适合以下场景:

  • IO 密集型任务:如 HTTP 请求、数据库查询、文件读写等
  • 高并发短任务:需要同时处理大量请求的业务场景
  • 异步编程简化:可以用同步的方式写代码,获得异步的性能

注意事项

  1. 不适合 CPU 密集型任务,这方面传统线程池仍然更合适
  2. 需要注意虚拟线程的调试方式与传统线程略有不同
  3. 在使用时要注意不要在虚拟线程中使用 ThreadLocal

三、模式匹配(Pattern Matching)

什么是模式匹配

模式匹配允许在代码中更简洁地进行类型检查和类型转换。以往我们写这样的代码:

if (obj instanceof String) {
    String s = (String) obj;
    // 使用 s
}

现在可以简化为:

if (obj instanceof String s) {
    // 直接使用 s
}

增强的 switch 表达式

Java 21 对 switch 表达式也做了增强,支持更灵活的模式匹配:

String result = switch (obj) {
    case Integer i -> "整数: " + i;
    case String s -> "字符串: " + s;
    case null -> "空值";
    default -> "其他类型";
};

使用感受

模式匹配这个特性从 Java 16 开始引入预览,经过几个版本的打磨,到 Java 21 已经完全稳定。实际使用中,确实能让代码更简洁、可读性更好,特别是处理多类型分支判断的场景。


四、序列化集合(Sequenced Collections)

Java 21 引入了一组新的接口,用于表示有顺序的集合。主要包括:

  • SequencedCollection - 有序集合
  • SequencedSet - 有序 Set
  • SequencedMap - 有序 Map

这些接口定义了统一的方法,比如:

  • getFirst() / getLast() - 获取首尾元素
  • reversed() - 获取反向视图
  • addFirst() / addLast() - 首尾添加元素

对于需要频繁操作集合首尾的场景,这个特性比较实用。


五、记录类(Records)与密封类(Sealed Classes)

这两个特性其实在更早的版本就引入了,但 Java 21 进一步完善。

记录类(Records) 适合作为不可变的数据载体:

public record User(Long id, String name, String email) {
    // 自动生成 equals()、hashCode()、toString()
    // 以及 getter 方法:id()、name()、email()
}

密封类(Sealed Classes) 用于限制类的继承层次:

public abstract sealed class Shape
    permits Circle, Rectangle, Square {
    // 只有指定的类可以继承
}

这两个特性结合使用,在领域驱动设计(DDD)场景中比较有用。


六、ZGC 优化

Java 21 对 ZGC(Z Garbage Collector)做了进一步优化,包括:

  • 动态并发线程数调整
  • 亚毫秒级停顿时间
  • 支持更大的堆内存

对于追求低延迟的应用来说,ZGC 是一个值得关注的选项。但具体效果需要结合实际业务场景进行测试验证。


七、总结

Java 21 作为 LTS 版本,确实带来了几个比较实用的特性。从个人角度:

  • 虚拟线程是最值得关注的变化,解决了一直以来 Java 在高并发场景下的线程资源消耗问题
  • 模式匹配让代码更简洁,提升可读性
  • 序列化集合提供了统一的 API

几点建议:

  1. 如果项目还在用较老的 JDK,可以开始规划升级路径
  2. 新特性上线前建议在测试环境充分验证,特别是虚拟线程的使用方式
  3. 不要为了用而用,选择真正适合业务场景的特性

以上是我的一些初步理解,可能有表述不准确的地方,欢迎指正交流。


本文仅代表个人技术观点,仅供参考。