关于 Java 18 你想知道的一切(下)

简介: 关于 Java 18 你想知道的一切(下)

如果你这里不写 default,并且,少了一种类型的话,例如:


image.png


那么就会报编译错误,这就是 switch 模式匹配的穷举性检查

在第二次预览中,主要修复了针对包含参数泛型的封闭类的穷举性检查,即有如下封闭类:


image.png


对于下面的代码,穷举性检查就不会误报编译错误了:


image.png


这个特性还在不断改善,大家可以试一下,并可以向这里提意见交流:https://mail.openjdk.java.net/pipermail/amber-spec-experts/2022-February/003240.html

孵化中的新特性


外部函数与内存 API(第二次孵化)

相关 JEP:


这个是 Project Panama(取名自巴拿马运河)带来的一个很重要的孵化中的特性,就像连接太平洋和大西洋的巴拿马运河一样,Project Panama 希望将 Java 虚拟机与外部的非 Java 库连接起来。这个特性就是其中最重要的一部分

这个特性主要目的是:

  • 首先,提供具有类似性能和安全特性 ByteBuffer API 的替代方案,修补了原有 API 的一些缺点(很多需要访问堆外内存的库,例如 Netty 操作直接内存作为缓存池这种,都会从中受益)
  • 其次,通过用更多面向 Java 的 API 来代替 JNI,使本机库更易访问,也就是你可以通过 Java 代码直接调用系统库
  • 最后,统一替换掉 sun.misc.Unsafe 里面关于内存访问的 API,换成了更易于使用的封装。

这里有一个例子,是关于使用 Foreign Linker API 实现使用 Java 直接调用 Windows 上面的 user32 库里面的 MessageBoxW 函数:


image.png


感兴趣可以看一下这个视频:Foreign Linker API: Java native access without C | Modern Java | JDK16 |Head Crashing Informatics 27

目前,一些有意思的正在使用外部函数与内存 API 实验的项目:


Vector API(第三次孵化)


相关 JEP:


这也是 Project Panama 中的一个重要组成部分。其中最主要的应用就是使用了 CPU 的 SIMD(单指令多数据)处理,它提供了通过程序的多通道数据流,可能有 4 条通道或 8 条通道或任意数量的单个数据元素流经的通道。并且 CPU 一次在所有通道上并行组织操作,这可以极大增加 CPU 吞吐量。通过 Vector API,Java 团队正在努力让 Java 程序员使用 Java 代码直接访问它;过去,他们必须在汇编代码级别对向量数学进行编程,或者使用 C/C++ 与 Intrinsic 一起使用,然后通过 JNI 提供给 Java。

一个主要的优化点就是循环,过去的循环(标量循环),一次在一个元素上执行,那很慢。现在,您可以使用 Vector API 将标量算法转换为速度更快的数据并行算法。一个使用 Vector 的例子:


微信图片_20220625195834.jpg


注意使用处于孵化的 Java 特性需要加上额外的启动参数将模块暴露,这里是--add-modules jdk.incubator.vector,需要在 javac 编译和 java 运行都加上这些参数,使用 IDEA 即:


image.png


image.png


测试结果:


image.png


其他使用,请参考:fizzbuzz-simd-style,这是一篇比较有意思的文章(虽然这个性能优化感觉不只由于 SIMD,还有算法优化的功劳,哈哈)

关于一些更加详细的使用,以及设计思路,可以参考这个音频:Vector API: SIMD Programming in Java


相关文章
|
JSON 数据可视化 Java
103.【Java Microbenchmark Harness】(六)
103.【Java Microbenchmark Harness】
57 0
103.【Java Microbenchmark Harness】(六)
|
Oracle JavaScript 前端开发
学JAVA,从现在开始-day02
每日记录自己学习java的心得和体会~
学JAVA,从现在开始-day02
|
存储 SQL 缓存
JAVA问答16
JAVA问答16
121 0
|
缓存 自然语言处理 监控
JAVA问答14
JAVA问答14
95 0
|
存储 Java 编译器
初识JAVA
学习Java语言入门需要了解的内容
109 0
1086 就不告诉你(JAVA)
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。
1086 就不告诉你(JAVA)
1088 三人行(JAVA)
子曰:“三人行,必有我师焉。择其善者而从之,其不善者而改之。”
1088 三人行(JAVA)
|
编解码 Java
1068 万绿丛中一点红(JAVA)
对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
1068 万绿丛中一点红(JAVA)
|
Android开发
java34-巩固练习
java34-巩固练习
97 0
java34-巩固练习
|
人工智能 Java
Java i++ 与 ++i
Java i++ 与 ++i
152 0
Java i++ 与 ++i