JDK 19 定于 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。
JDK 19 只有 7 个新特性:
这里只对 424、425、426、428 这 4 个我觉得比较重要的新特性进行详细介绍。
Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱。
外部函数和内存 API 之前在 JDK 17 中孵化,在 JDK 18 中重新孵化。
在没有外部函数和内存 API 之前:
Unsafe
类让 Java 语言拥有了类似 C 语言指针一样操作内存空间的能力的同时,也增加了 Java 语言的不安全性,不正确使用 Unsafe
类会使得程序出错的概率变大。引入外部函数和内存 API 就是为了解决 Java 访问外部函数和外部内存存在的一些痛点。
Foreign Function & Memory API (FFM API) 定义了类和接口:
MemorySegment
、、MemoryAddress
和SegmentAllocator
);MemoryLayout
, VarHandle
;MemorySession
;Linker
、FunctionDescriptor
和SymbolLookup
。下面是 FFM API 使用示例,这段代码获取了 C 库函数的 radixsort
方法句柄,然后使用它对 Java 数组中的四个字符串进行排序。
虚拟线程是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。
虚拟线程在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。
虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。
向量(Vector) API 最初由JEP 338[13]提出,并作为孵化 API[14]集成到 JDK 16 中。第二轮孵化由JEP 414[15]提出并集成到 JDK 17 中。第三轮孵化由JEP 417[16]提出并集成到 JDK 18 中。
向量计算由对向量的一系列操作组成。向量 API 用来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。
向量 API 的目标是为用户提供简洁易用且与平台无关的表达范围广泛的向量计算。
这是对数组元素的简单标量计算:
这是使用 Vector API 进行的等效向量计算:
JDK 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代java.util.concurrent
,目前处于孵化器阶段。
结构化并发将不同线程中运行的多个任务视为单个工作单元,从而简化错误处理、提高可靠性并增强可观察性。也就是说,结构化并发保留了单线程代码的可读性、可维护性和可观察性。
结构化并发的基本 API 是`StructuredTaskScope`[17]。StructuredTaskScope
支持将任务拆分为多个并发子任务,在它们自己的线程中执行,并且子任务必须在主任务继续之前完成。
StructuredTaskScope
的基本用法如下:
结构化并发非常适合虚拟线程,虚拟线程是 JDK 实现的轻量级线程。许多虚拟线程共享同一个操作系统线程,从而允许非常多的虚拟线程。
[1]
JEP 405: Record Patterns(记录模式): https://openjdk.org/jeps/405
[2]
JEP 422: Linux/RISC-V Port: https://openjdk.org/jeps/422
[3]
JEP 424: Foreign Function & Memory API(外部函数和内存 API): https://openjdk.org/jeps/424
[4]
JEP 425: Virtual Threads(虚拟线程): https://openjdk.org/jeps/425
[5]
JEP 426: Vector(向量)API: https://openjdk.java.net/jeps/426
[6]
JEP 427: Pattern Matching for switch(switch 模式匹配): https://openjdk.java.net/jeps/427
[7]
JEP 428: Structured Concurrency(结构化并发): https://openjdk.org/jeps/428
[8]
sun.misc.Unsafe
: https://hg.openjdk.java.net/jdk/jdk/file/tip/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java
[9]
Guide to JNI (Java Native Interface): https://www.baeldung.com/jni
[10]
JNA: https://github.com/java-native-access/jna
[11]
JNR: https://github.com/jnr/jnr-ffi
[12]
JavaCPP: https://github.com/bytedeco/javacpp
[13]
JEP 338: https://openjdk.java.net/jeps/338
[14]
孵化 API: http://openjdk.java.net/jeps/11
[15]
JEP 414: https://openjdk.java.net/jeps/414
[16]
JEP 417: https://openjdk.java.net/jeps/417
[17]
StructuredTaskScope
: https://download.java.net/java/early_access/loom/docs/api/jdk.incubator.concurrent/jdk/incubator/concurrent/StructuredTaskScope.html
·········· END ··············