JDK 21开发者新特性
虚拟线程
Java的传统线程模型在创建线程数超过操作系统处理能力时,会迅速成为昂贵操作。此外,当线程生命周期不长时,创建线程的成本也很高。
虚拟线程通过将Java线程映射到管理线程操作的载体线程来解决这个问题。相比之下,载体线程与操作系统线程协同工作。这种抽象为开发人员提供了更大的灵活性和控制力。参见图1。
图1:JDK 21中的虚拟线程模型
以下是虚拟线程的示例,与操作系统/平台线程形成良好对比。该程序使用ExecutorService创建10,000个任务,并等待所有任务完成。在后台,JDK将在有限数量的载体和操作系统线程上运行此程序,使您能够轻松编写并发代码。
|
|
结构化并发(预览)
结构化并发与虚拟线程紧密相关,它通过提供增强开发者体验的API,旨在消除取消、关闭、线程泄漏等常见风险。如果任务拆分为并发子任务,那么它们都应返回到同一位置,即任务的代码块。
在图2中,findUser和fetchOrder都需要执行以从不同服务获取数据,然后使用该数据组合结果,并将其返回给消费者。通常,这些任务可以并发执行,但如果findUser没有返回,可能会容易出错;fetchOrder需要等待其完成,最后执行Join操作。
图2:结构化并发示例
此外,子任务的生命周期不应超过父任务本身。想象一个任务操作,如果每个操作都在线程中执行,它将并发组合多个快速运行的I/O操作的结果。结构化并发模型通过利用虚拟线程API和StructuredTaskScope,使线程编程更接近单线程代码风格的易用性。
|
|
顺序集合
在JDK 21中,引入了一组新的集合接口以增强使用集合的体验(图3)。例如,如果需要从集合中获取元素的逆序,根据使用的集合类型,可能会很繁琐。根据使用的集合类型,检索遇到顺序可能存在不一致;例如,SortedSet实现了一个,但HashSet没有,这使得在不同数据集上实现这一点很麻烦。
图3:顺序集合
为了解决这个问题,SequencedCollection接口通过添加reverse方法以及获取第一个和最后一个元素的能力来辅助遇到顺序。此外,还有SequencedMap和SequencedSet接口。
|
|
所以现在,不仅可以获取遇到顺序,还可以删除和添加第一个和最后一个元素。
记录模式
记录在Java 14中作为预览功能引入,这也给了我们Java枚举。record是Java中的另一种特殊类型,其目的是简化仅作为数据载体的类的开发过程。
在JDK 21中,记录模式和类型模式可以嵌套,以实现声明性和可组合的数据导航和处理形式。
|
|
在JDK 21之前,需要解构整个记录以检索访问器。然而,现在获取值要简化得多。例如:
|
|
记录模式的另一个优势是嵌套记录和访问它们。来自JEP定义本身的示例显示了获取Point值的能力,这些值是ColoredPoint的一部分,而ColoredPoint嵌套在Rectangle中。这使得它比以前更有用,以前每次都需要解构所有记录。
字符串模板
字符串模板是JDK 21中的预览功能。然而,它试图为字符串操作带来更可靠的性能和更好的体验,以避免有时可能导致不良结果(如注入)的常见陷阱。现在,您可以编写模板表达式并在字符串中呈现它们。
|
|
在这种情况下,第二行是表达式,调用时应呈现Hello Shaaf。此外,在可能存在非法字符串的情况下,例如可能导致安全问题的SQL语句或HTML,模板规则只允许转义引号,不允许HTML文档中的非法实体。
JDK 21中的更多JEP
本文未涵盖但在另一篇文章中讨论的其他JEP:
- JEP 439:分代式ZGC
- JEP 441:switch模式匹配
- JEP 442:外部函数和内存API(第三次预览)
- JEP 443:未命名模式和变量(预览)
- JEP 445:未命名类和实例主方法(预览)
- JEP 448:向量API(第六个孵化器)
- JEP 449:弃用Windows 32位x86端口以准备移除
- JEP 451:准备禁止代理的动态加载
- JEP 452:密钥封装机制API
获取Java支持
红帽客户可以通过订阅红帽运行时、红帽企业Linux和红帽OpenShift获得对OpenJDK和Eclipse Temurin的支持。请联系您当地的红帽代表或红帽销售以获取更多详细信息。您可以期望获得对Java和其他运行时的支持,如红帽产品更新和支持生命周期中所述。
资源
- 视频:什么是Eclipse Temurin?
- 开始使用Eclipse Temurin
- 红帽加入Eclipse Adoptium工作组
- Eclipse Adoptium实现其第一个Java SE版本
- 红帽为Microsoft Windows上的OpenJDK引入商业支持
- OpenJDK的历史和未来