Java 20新特性概述

server/2024/10/23 9:23:14/

Java 20发布于2023年3月21日,共七个新特性:

  • JEP 429:Scoped Values (Incubator)作用域值 (第一轮孵化)

  • JEP 432:Record Patterns (Second Preview)记录模式 (第二次预览)

  • JEP 433:Pattern Matching for switch (Fourth Preview) Switch的模式匹配(第四次预览)

  • JEP 434:Foreign Function & Memory API (Second Preview)外部函数和内存 API(第二次预览)

  • JEP 436:Virtual Threads (Second Preview) 虚拟线程 (第二次预览)

  • JEP 437:Structured Concurrency (Second Incubator)结构化并发 (第二次孵化)

  • JEP 438:Vector API (Fifth Incubator)向量 API(第五轮孵化)

更多内容读者可自行阅读:OpenJDK Java 20文档

一、 JEP 429:作用域值 (第一轮孵化)

该特性会在Java 21进行首次预览,具体内容可参考Java 21对该特性的介绍。

二、 JEP 432:记录模式(第二次预览)

  • 记录模式由 JEP 405 作为预览功能提出,并在 JDK 19 中提供。

  • 此 JEP 提出了第二个预览版,并根据持续的经验和反馈进行了进一步改进。

Java 20对记录模式进一步增强:

  • 支持对泛型记录模式的类型参数推断。

  • 允许记录模式出现在for语句中。

  • 删除对命令记录模式的支持。

就说下第二个改进点吧:

java">public record Point(int x, int y) {}void dump(Point[] points){//records模式for (Point(var x, var y) : points) {System.out.println(x + " " + y);}
}

ps:这个改进点在Java 21中被废弃

三、 JEP 433:Switch的模式匹配(第四次预览)

  • Swicth模式匹配由JEP 406作为预览功能提出并在JDK 17中交付。

  • 由JEP 420作为第二个预览提出并在JDK 18中交付。

  • 由JEP 427作为第三个预览提出并在JDK 19中交付。

  • 这个JEP提出了第四个预览,以使其与记录模式预览功能(JEP 432)继续共同发展,并允许基于持续的经验和反馈进行其他改进

Java 20相对重要改进:由原先抛IncompatibleClassChangeError变为抛MatchException

四、 JEP 434:外部函数和内存API(第二次预览)

外部函数和内存(FFM)API结合了两个早期的孵化API:外部内存访问API(JEPs 370、383和393)和外部链接器API(JEP 389)。

  • FFM API 通过 JEP 412 在 JDK 17 中孵化。

  • 通过 JEP 419 在 JDK 18 中重新孵化。

  • 首次通过 JEP 424 在 JDK 19 中预览。

  • 此 JEP 建议根据反馈进行改进,并在 JDK 20 中重新预览 API。

Java 20主要有三个改进点:

  • MemorySegment 和 MemoryAddress 抽象是统一的(内存地址现在由零长度内存段建模)。

  • 封闭的 MemoryLayout 层次结构得到了增强,以便于在 switch 表达式和语句中使用模式匹配 (JEP 433)。

  • MemorySession 已拆分为 Arena 和 SegmentScope,以便于跨维护边界共享段。

五、JEP 436:虚拟线程 (第二次预览)

参考Java 21的虚拟线程是怎么回事。

六、JEP 437: 结构化并发 (第二轮孵化)

  • 结构化并发由 JEP 428 提出,并在 JDK 19 中作为孵化 API 提供。

  • 此 JEP 建议在 JDK 20 中重新孵化 API,无需更改。

Java 20对这一特性进行了微调,以下内容摘自Java 19对结构化并发的介绍:

Java 19引入了结构化并发,一种多线程编程方式,目的是为了通过结构化并发API来简化多线程编程,目前处于孵化阶段。

结构化并发 API 的主要类是 StructuredTaskScope。这个类允许开发者将一个任务组织成一组并发子任务,并将它们作为一个整体进行协调。子任务在各自的线程中执行,通过分别分叉(fork)它们,然后作为一个整体进行合并(join),并且可能作为一个整体进行取消。子任务的成功结果或异常由父任务进行聚合和处理。StructuredTaskScope 将子任务或分叉的生命周期限制在一个明确的词法范围内,在这个范围内,任务与其子任务的所有交互——包括分叉、合并、取消、处理错误和结果组合——都发生在此范围内。

StructuredTaskScope一般工作流程如下:

  • 创建一个作用域(scope)。创建作用域的线程是它的所有者。

  • 在作用域中分叉(fork)并发子任务。

  • 作用域中的任何分叉或作用域的所有者都可以调用作用域的 shutdown() 方法来请求取消所有剩余的子任务。

  • 作用域的所有者作为一个整体加入作用域,即所有分叉。所有者可以调用作用域的 join() 方法,该方法会阻塞直到所有分叉要么完成(成功或失败),要么通过 shutdown() 被取消。或者,所有者可以调用作用域的 joinUntil(java.time.Instant) 方法,该方法接受一个截止时间。

  • 加入后,处理任何分叉中的错误并处理它们的结果。

  • 关闭作用域,通常通过 try-with-resources 隐式完成。这会关闭作用域并等待任何滞后的分叉完成。

这是官方给的一个示例:

java">Response handle() throws ExecutionException, InterruptedException {try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {//使用fork方法派生线程来执行任务Future<String> user  = scope.fork(() -> findUser());Future<Integer> order = scope.fork(() -> fetchOrder());
​scope.join();           // 将两个fork合并scope.throwIfFailed();  // ...出现异常(抛异常)
​// 代表这两个fork都成功了,组合它们的结果。return new Response(user.resultNow(), order.resultNow());}
}

七、JEP 438:向量 API(第五轮孵化)

  • 向量 API最初由JEP 338提出,并作为孵化API集成到JDK 16中。

  • 第二轮孵化由JEP 414提出,并集成到JDK 17中。

  • 第三轮孵化由JEP 417提出,并集成到JDK 18中。

  • 第四轮孵化由JEP 426提出,并集成到JDK 19中。

此JEP建议在JDK 20中重新孵化API,相对于JDK 19,API没有任何更改。这个在Java 16时介绍过,这里就不再赘述了。

End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。 


http://www.ppmy.cn/server/134132.html

相关文章

2024年水利水电安全员考试题库及答案

一、判断题 1.职业禁忌指员工从事特定职业或者接触特定职业危害因素时&#xff0c;比一般职业人更易于遭受职业危害的侵袭和罹患职业病&#xff0c;或者可能导致原有自身疾病的病情加重&#xff0c;或者在从事作业过程中诱发可能导致对他人生命健康构成危险的疾病的个人特殊生…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数&#xff0c;下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

LinkAndroid v0.0.12 发布,手机连接助手,日志查看、投屏设置、多处问题修复

LinkAndroid 是一个全能手机连接助手&#xff0c;方便快捷的连接 Android 和电脑&#xff0c;连接手机后可投屏、GIF/MP4录屏、截屏、文件管理、手机操作等功能。 功能特性 支持多手机连接&#xff0c;方便快捷控制多个手机 支持投屏&#xff0c;基于 scrcpy&#xff0c;支持手…

Qt记录使用QtAwesome

Qt记录使用QtAwesome 基本使用 基本使用 pro文件添加 CONFIG fontAwesomeFree include(QtAwesome/QtAwesome.pri) //实例化QtAwesome fa::QtAwesome* awesome new fa::QtAwesome(this); awesome->initFontAwesome();//设置外置适应 图标ICON的颜色color QVariantMap opt…

基准线markLine的值超过坐标轴范围导致markline不显示

解决问题&#xff1a;动态设置yAxis的max值&#xff08;解决基准线不在y轴范围&#xff09; yAxis: [{name: 单位&#xff1a;千,...yAxis,nameTextStyle:{...yAxis.nameTextStyle,padding: [0,26,0,24]},paddingLeft:24,paddingRight:26},{name: 单位&#xff1a;百分比,...yA…

DLNA—— 开启智能生活多媒体共享新时代

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、DLNA是什么&#xff1f;二、DLNA 协议的关键技术三、 DLNA 协议的应用场景总结 前言 在当今快节奏的生活中&#xff0c;我们常常会遇到这样的场景&#x…

【云原生】Kubernetes部署Jenkins静动Slave

Kubernetes部署Jenkins静动Slave 文章目录 Kubernetes部署Jenkins静动Slave文档介绍资源列表基础环境一、Jenkins Kubernetes清单文件二、使用静态Slave2.1、安装Kubernetes插件2.2、添加Agent2.3、使用Slave 三、使用动态Slave3.1、添加凭据3.2、配置动态Slave3.3、配置Jenkin…

【小趴菜前端实习日记5】

实习日记5 一、vue3中如何使用router&#xff08;获取this)二、ts中用object定义类型太宽泛导致Ts无法推断出正确类型三、动态设置日记封面失败vite动态引入静态资源1.方法一vue3父子组件生命周期执行顺序 2.方法二3.方法三 四、打包问题总结1.The import.meta meta-property i…