结构化并发(Structured concurrency)是一种处于预览阶段的并发编程模式,通过提供结构化并发的API,将在不同线程中运行的一组相关任务视为一个单一的工作单元。这简化了错误处理和取消操作,提高了可靠性和可观察性。结构化并发先前在JDK 20和JDK 19中进行了孵化,分别于2022年3月和9月发布;它将作为java.util.concurrent包中的预览API进行展示。这次的唯一重大变化是StructuredTaskScope::Fork(…)方法返回一个Future而不是一个void。结构化并发的目标包括推广一种并发编程风格,可以消除由于取消和关闭而产生的常见风险,如线程泄漏和取消延迟,并提高并发代码的可观察性。
作用域值(Scoped values)也处于预览阶段,它们可以在线程内部和跨线程之间共享不可变数据。它们比线程本地变量更受欢迎,特别是在使用大量虚拟线程时。线程本地变量存在设计缺陷,包括无限制的可变性、无限期的生命周期和昂贵的继承。作用域值允许在大型程序中在组件之间安全地共享数据,而无需使用方法参数。这个提案在JDK 20中进行了孵化。计划的目标包括易用性、可理解性、健壮性和性能。
一项提案旨在禁止动态加载代理(agents)的调用,当代理动态加载到正在运行的JVM中时,将发出警告。这些警告旨在为将来的版本做准备,该版本默认禁止动态加载代理,以默认提高完整性。该提案的其他目标包括重新评估可维护性(serviceability)和完整性(integrity)之间的平衡,可维护性涉及对运行中的代码进行临时更改,而完整性则假设运行中的代码不会被任意更改,并确保大多数不需要动态加载代理的工具不受影响。该计划还要求将动态加载代理的能力与其他所谓的“超级能力”(如深度反射)保持一致。代理是一种可以在应用程序运行时修改应用程序代码的组件;它们是在2004年的JDK 5中由Java平台分析架构引入的,作为工具(尤其是分析器)对类进行仪器化的一种方式。虽然代理的设计考虑了良性仪器化,但高级开发人员发现了一些用例,例如面向方面的编程,可以以任意方式改变应用程序行为。代理也可以修改应用程序之外的代码,例如JDK本身的代码。JDK 5要求在命令行上指定代理,以确保应用程序的所有者批准使用代理。在JDK 21中,计划要求应用程序所有者批准动态加载代理,就像启动时加载代理一样。这个改变将使Java平台更加默认地接近完整性。
密钥封装机制(Key Encapsulation Mechanisms)的API是一种通过公共密码学来保护对称密钥的加密技术。该提案的一个目标是使应用程序能够使用KEM算法,例如RSA密钥封装机制(RSA-KEM)、椭圆曲线综合加密方案(ECIES)以及国家标准与技术研究所(NIST)后量子密码标准化过程的候选算法。另一个目标是使KEM能够在更高级的协议(如传输层安全协议TLS)和密码方案(如混合公钥加密HPKE)中使用。安全提供者可以使用Java代码或本地代码实现KEM算法,并包括RFC 9180中定义的Diffie-Hellman KEM(DHKEM)的实现。
计划废弃Windows 32位x86端口,并在将来的版本中删除该端口。该提案旨在更新构建系统,在尝试配置Windows 32位x86构建时发出错误消息。该消息可以通过新的配置选项进行抑制。此外,计划在相关文档中将该端口和相关的端口特定功能标记为废弃以备删除。该提案指出,支持32位操作的最后一个Windows操作系统Windows 10将于2025年10月结束生命周期。
未命名类和实例主方法的预览版旨在发展Java语言,使学生能够编写他们的第一个Java程序,而无需理解为大型程序设计而设计的语言特性。学生可以编写简化的单类程序声明,然后随着技能的提高,无缝地扩展程序以使用更高级的功能。该提案不仅为Java提供了平滑的入门路径,还减少了编写简单Java程序(如脚本和命令行实用程序)所涉及的仪式感。
未命名模式和变量的预览版。未命名模式匹配记录组件而不声明组件的名称或类型,而未命名变量可以初始化但不能使用。两者都由下划线字符表示。该提案旨在通过省略不必要的嵌套模式来提高记录模式的可读性,并通过识别必须声明但不会使用的变量来提高所有代码的可维护性。
Generational ZGC旨在通过将ZGC扩展为为年轻对象和老年对象维护单独的代来提高应用程序性能。年轻对象往往会早死;维护单独的代将使ZGC能够更频繁地收集年轻对象。使用分代ZGC运行的应用程序应该能够获得以下好处:降低分配停顿的风险、降低所需的堆内存开销和降低垃圾回收的CPU开销。与非分代ZGC相比,这些好处应该可以在不显著降低吞吐量的情况下实现。
记录模式在JDK 19和JDK 20中进行了预览,用于解构记录值。记录模式和类型模式可以嵌套使用,以实现强大、声明性和可组合的数据导航和处理形式。该提案的目标包括将模式匹配扩展到解构记录类的实例,并添加嵌套模式,以实现更可组合的数据查询。该功能与用于switch表达式和语句的模式匹配一起共同发展(见下文)。当前JEP(JDK增强提案)中的记录模式提案将根据持续的经验和反馈进行进一步的改进,最终确定该功能。除了一些次要的编辑更改外,自第二个预览版以来的主要变化是删除了增强语句头部中出现记录模式的支持。该功能可能会在未来的JEP中重新提出。
switch语句的模式匹配功能使得可以针对一个表达式或语句进行多个模式的测试,每个模式都有特定的操作,从而可以安全而简洁地表达复杂的面向数据的查询。该功能最初在JDK 17中提出,随后在JDK 18、JDK 19和JDK 20中进行了进一步的改进。在JDK 21中将通过反馈和经验进行进一步的改进并最终确定。与之前的JEP相比,主要的变化是删除了带括号的模式,并允许使用限定的枚举常量,例如带有表达式和语句的case常量。目标包括通过允许模式出现在case标签中来扩展表达式和语句的表达能力和适用性,允许在需要时放宽历史上的null安全性,通过要求模式语句覆盖所有潜在的输入值来增加语句的安全性。另一个目标是确保现有的表达式和语句在没有任何更改的情况下继续编译并具有相同的语义。
第六个孵化器是一个向量API。该API可以表达向量计算,可在支持的CPU架构上可靠地编译为最佳向量指令,实现比等效的标量计算更高的性能。向量API先前在JDK 16到JDK 20中进行了孵化。这个最新版本包括性能增强和错误修复。该提案的目标包括清晰简洁、与平台无关,并在x64和AArch64架构上提供可靠的运行时编译和性能。其他目标包括在无法完全表达为一系列向量指令的情况下,优雅地降级。
第三个预览版是一个外部函数和内存API,它使Java程序能够与Java运行时之外的代码和数据进行互操作。通过高效地调用外部函数和安全地访问外部内存,该API使Java程序能够调用本地库并处理本地数据,而不会出现JNI(Java Native Interface)的脆弱性和危险性。该API先前在JDK 20和JDK 19中进行了预览。JDK 21预览版中的改进包括增强的布局路径,其中包含一个新的元素来解引用地址布局,接口中本地段的生命周期的集中管理,一个备用的本地链接器实现,以及删除了某些内容。该提案的目标包括易用性、性能、通用性和安全性。它的目标不是在这个API之上重新实现JNI,也不会以任何方式改变JNI。
虚拟线程是轻量级线程,承诺大大减少编写、维护和观察高吞吐量并发应用程序的工作量。该计划的目标包括使以简单的每个请求一个线程的方式编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展,使使用该API的现有代码能够以最小的更改采用虚拟线程,并使用当前的JDK工具轻松调试和分析虚拟线程。虚拟线程先前在JDK 20和JDK 19中进行了预览,将在JDK 21中最终确定。在JDK 21中,虚拟线程现在始终支持线程本地变量,并且不可能创建没有这些变量的虚拟线程。对线程本地变量的保证支持确保更多现有的库可以无需更改地与虚拟线程一起使用,并有助于将面向任务的代码迁移到使用虚拟线程。
顺序集合提案引入了表示具有定义的遇到顺序的集合的接口。每个集合都有明确定义的第一个元素、第二个元素等,直到最后一个元素。提供了统一的API来接受第一个和最后一个元素,并以相反的顺序处理元素。该提案的动机是Java的集合框架缺乏一种表示具有定义的遇到顺序的元素序列的集合类型,也缺乏适用于这些集合的统一操作集。这些差距一直是一个问题和投诉的来源。该提案要求为顺序集合、集合和映射定义接口,并将这些接口适配到现有的集合类型层次结构中。所有这些新方法都有默认实现。
字符串模板是JDK 21中的一个预览功能,它通过将文字文本与嵌入式表达式和处理器相结合,产生特定的结果,来补充Java现有的字符串字面量和文本块。这个语言特性和API旨在通过简化编写Java程序,使得在运行时计算的值可以轻松地表达在字符串中。它承诺提高表达式的可读性,改善程序的安全性,保持灵活性,并简化接受非Java语言编写的字符串的API的使用。还有一个目标是使得可以开发从组合文字文本和嵌入式表达式派生的非字符串表达式。
文章转载自云原生数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




