Blog chevron_right 未分类

JDK 21 提供虚拟线程等新功能以及长期支持

作为最新版 LTS OpenJDK,JDK 21 最重要的新功能是虚拟线程。虚拟线程可通过使用多对一映射大幅提高应用程序的可扩展性。

JDK 21 现已发布,对于 OpenJDK 二进制文件发行版,这是一个长期支持 (LTS) 版本。这意味着,根据您的具体发行版,JDK 21 会进行多年常规安全性更新和针对错误修复的更新。对于 Azul Zulu 版本,该支持至少会持续八年。

对于开发者和最终用户来说,JDK 21 备受期待,因为该版本添加了很多新功能。在这方面可展开讨论的内容有很多,但在本文中,我们只谈论 JDK 21 本身的功能,而非自上一个 LTS 版本 JDK 17 以来添加的所有功能。

虚拟线程终于成为全平台功能

JDK 21 重要的新功能当属虚拟线程 (JEP 444)。自 JDK 19 以来,虚拟线程一直是预览版功能,而现在已成为全平台功能。

从最初开始,Java 就通过基础 Thread 类将单独并发执行线程内置于语言中。许多支持大量同时发生的客户端交互的企业应用程序使用众所周知的 Thread-Per-Request 编程模式。顾名思义,每个客户端连接都分配了自己的线程来处理该客户端的工作,既与所有其他连接隔离,又能与所有其他连接同时执行。这种方法收效良好,但由于 Java 线程与底层操作系统平台线程是一对一映射,因此无法扩展到大量连接。每个平台线程仅在提供堆栈和核心功能方面就需要 2MB 内存。如果要支持一百万个用户,就需要 2TB 的内存!

这类应用程序的另一个普遍特点是,它们大部分时间都处于受阻状态,需等待数据库访问、文件读取或网络连接等操作的完成。

虚拟线程可通过使用多对一映射,让这些应用程序的可扩展性大幅提高。尽管仍然使用 Thread 类,但在多对一映射中,许多虚拟线程共享一个平台线程。当虚拟线程休眠以进行 IO 时,JVM 可以通过上下文切换来切换到另一个已准备好运行的线程。完成 IO 操作后,初始线程就可以重新运行,并在有可用的平台线程时返回平台线程。

虽然这确实提高了这类应用程序的可扩展性,但它不是万能的,不应随处使用。必须了解的是,与操作系统管理进程的方式不同,虚拟线程不是分时的。如果一个线程需要做的是计算密集型而非 IO 密集型作业,使用虚拟线程可能导致可扩展性和性能下降而非提高。 

JDK 21 还有很多吸引开发者的其他功能:

  • 顺序集合 (JEP 431):  尽管标准类库已包含带有特定顺序的集合(例如 List),但它们没有通用类型。Java API 的这一小小更改引入了一个新的接口 SequencedCollection,该接口由所有带特定顺序(Deque、SortedSet 等)的集合实现。这将简化某些代码构造。
  • 字符串模板 (JEP 430):作为一项预览版功能,字符串模版可简化构建需要内置变量组件的字符串的过程。除了能插入简单值外,模版还能直接添加更多复杂评估,例如算数运算或调用方法。
  • 模式使用增加(JEP 440441 以及 443:自 JDK 14 以来,模式匹配功能逐步推出。作为一种编程概念,模式匹配起源于二十世纪 60 年代后期。添加的上述功能基于其他较新的 Java 功能构建,例如记录类和密封类。 

在 JDK 21 中,记录模式成为了一项完整功能。以解构模式为例,记录中的内容可以直接通过模式变量访问。 

用于切换的模式匹配也成为了一项完整功能,这让我们可以通过类型进行切换并通过模式变量提供访问权限。

最后,我们引入了未命名模式和变量,这也是一项预览版功能。在不使用模式变量的情况下,我们可以用一个下划线来表示它们的存在(但不表示它们的详细情况),从而提高可读性。

  • 结构化并发和作用域值(JEP 453 446:和虚拟线程一样,这两项功能都是更大的 OpenJDK Project Loom 的一部分。

结构化并发提供了一种将作为独立线程创建的子任务分在一组的方法,以保证它们都能以可预测的方式完成或失败。未完成的子任务会被优雅终止,并且处理异常的方式会使跟踪和调试更加透明。 

作用域值是线程本地变量的替代。使用值代替变量可以提高性能,并使代码更易于理解。

  • 未命名类和实例主方法 (JEP 445):该功能旨在让使用 Java 语言开始编程更容易。即使是用 Java 编写最简单直接的“Hello World”应用程序,也需要写相对大量的代码并理解许多基本概念。而现在只需三行代码:

      void main() {
        System.out.println(“Hello World”);
      }

包括对 Vector API (JEP 448) 以及 Foreign Function 和 Memory API (JEP 442) 孵化模块的进一步更新在内,JDK 21 是自 JDK 9 以来功能最丰富的版本。

Azul 将通过专题博客文章、网络研讨会和开发者大会上的演讲,对这些功能进行更详细的介绍。敬请查看我们网站的其他部分,找到上述内容的对应链接。

如果您准备试用 JDK 21,现在就可以下载我们提供商业支持的免费版 OpenJDK Zulu 版本。亲自尝试,探索精彩

下载 JDK 21

查找适合您的版本、操作系统和架构。