JDK 21 是一个长期支持(LTS)版本,相比 JDK 17,引入了许多新特性和功能,涵盖语言特性、性能优化、API 增强和工具改进。以下是 JDK 21 相比 JDK 17 的主要新特性、使用代码示例以及使用它的好处。
JDK 21 相比 JDK 17 的主要新特性
1. 虚拟线程(Virtual Threads)
-
功能:虚拟线程是轻量级线程,极大地提升了并发性能。它们由 JVM 管理,消耗的资源远少于传统的操作系统线程。
-
好处:
- 支持大规模并发,适合高并发场景(如 Web 服务器、微服务)。
- 简化了异步编程模型,开发者可以直接使用同步代码风格处理并发任务。
示例代码:
import java.util.concurrent.Executors;
public class VirtualThreadsExample {
public static void main(String[] args) throws InterruptedException {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println("Running in virtual thread: " + Thread.currentThread());
});
}
}
}
}
2. 字符串模板(String Templates,预览特性)
-
功能:字符串模板允许在字符串中嵌入变量和表达式,提供了更简洁的字符串拼接方式。
-
好处:
- 提高代码可读性,减少样板代码。
- 避免手动拼接字符串的错误。
示例代码:
public class StringTemplateExample {
public static void main(String[] args) {
int age = 30;
String name = "Alice";
String message = STR."Hello, {name}. You are {age} years old.";
System.out.println(message);
}
}
3. 记录模式(Record Patterns)
-
功能:记录模式允许在模式匹配中解构
record类型的对象,直接访问其字段。 -
好处:
- 简化代码逻辑,减少样板代码。
- 提高模式匹配的灵活性。
示例代码:
record Point(int x, int y) {}
public class RecordPatternExample {
public static void main(String[] args) {
Object obj = new Point(3, 4);
if (obj instanceof Point(int x, int y)) {
System.out.println("Point coordinates: " + x + ", " + y);
}
}
}
4. Scoped Values(预览特性)
-
功能:Scoped Values 提供了一种线程安全的值传递机制,适合在虚拟线程中共享不可变数据。
-
好处:
- 替代
ThreadLocal,更高效且线程安全。 - 避免了
ThreadLocal的内存泄漏问题。
- 替代
示例代码:
import jdk.incubator.concurrent.ScopedValue;
public class ScopedValueExample {
static final ScopedValue<String> USER = ScopedValue.newInstance();
public static void main(String[] args) throws InterruptedException {
ScopedValue.where(USER, "Alice").run(() -> {
System.out.println("Current user: " + USER.get());
});
}
}
5. Vector API(正式特性)
-
功能:Vector API 提供了矢量化计算的支持,利用硬件 SIMD 指令提高性能。
-
好处:
- 提高高性能计算的效率,适合机器学习、图像处理等场景。
示例代码:
import jdk.incubator.vector.*;
public class VectorApiExample {
public static void main(String[] args) {
var species = FloatVector.SPECIES_256;
var a = FloatVector.fromArray(species, new float[]{1.0f, 2.0f, 3.0f, 4.0f}, 0);
var b = FloatVector.fromArray(species, new float[]{5.0f, 6.0f, 7.0f, 8.0f}, 0);
var c = a.add(b);
c.intoArray(new float[4], 0);
System.out.println(c);
}
}
6. 性能优化
-
垃圾回收器改进:
- ZGC 和 G1 GC 进一步优化,减少延迟,提高吞吐量。
- Generational ZGC:引入分代机制,进一步提升 ZGC 的性能。
-
好处:
- 更低的垃圾回收延迟,适合低延迟应用。
- 更高的吞吐量,适合高性能服务器。
7. 外部函数和内存 API(正式特性)
-
功能:允许 Java 程序直接调用本地代码(如 C 函数)并操作内存。
-
好处:
- 替代 JNI,提供更高效和安全的本地代码交互方式。
- 简化与本地库的集成。
示例代码
import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
public class ForeignFunctionExample {
public static void main(String[] args) throws Throwable {
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(
stdlib.find("strlen").orElseThrow(),
FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)
);
MemorySegment cString = CLinker.toCString("Hello, JDK 21!");
long length = (long) strlen.invoke(cString);
System.out.println("String length: " + length);
}
}
8. 其他改进
HttpClient超时配置增强:支持更灵活的超时配置。java.util.concurrent增强:改进了并发工具类的性能和功能。
JDK 21 的好处
-
提升并发性能:
- 虚拟线程支持大规模并发,简化了异步编程模型。
-
提高开发效率:
- 新的语言特性(如字符串模板、记录模式)减少了样板代码,提高了代码可读性。
-
性能优化:
- 垃圾回收器的改进和矢量化计算支持显著提升了运行时性能。
-
更强的本地代码支持:
- 外部函数和内存 API 提供了更高效和安全的本地代码交互方式。
-
长期支持(LTS) :
- JDK 21 是一个长期支持版本,适合在生产环境中使用。
JDK 21 相比 JDK 17 的对比总结
| 特性/版本 | JDK 17 | JDK 21 |
|---|---|---|
| LTS 支持 | 是 | 是 |
| 虚拟线程 | 不支持 | 支持 |
| 字符串模板 | 不支持 | 支持(预览特性) |
| 记录模式 | 不支持 | 支持 |
| Scoped Values | 不支持 | 支持(预览特性) |
| 矢量化计算 | 支持(预览特性) | 支持(正式特性) |
| 外部函数和内存 API | 支持(预览特性) | 支持(正式特性) |
| 垃圾回收器优化 | ZGC 和 G1 GC 优化 | Generational ZGC,进一步优化 |
选择建议
- JDK 17:适合需要稳定性且不需要最新特性的项目。
- JDK 21:推荐用于现代化开发,支持更多语言特性和性能优化,适合长期支持的生产环境。