JDK21 相比 JDK17

671 阅读4分钟

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());
                });
            }
        }
    }
}

JDK21 虚拟线程

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());
        });
    }
}

JDK21 Scoped Values

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 的好处

  1. 提升并发性能

    • 虚拟线程支持大规模并发,简化了异步编程模型。
  2. 提高开发效率

    • 新的语言特性(如字符串模板、记录模式)减少了样板代码,提高了代码可读性。
  3. 性能优化

    • 垃圾回收器的改进和矢量化计算支持显著提升了运行时性能。
  4. 更强的本地代码支持

    • 外部函数和内存 API 提供了更高效和安全的本地代码交互方式。
  5. 长期支持(LTS)

    • JDK 21 是一个长期支持版本,适合在生产环境中使用。

JDK 21 相比 JDK 17 的对比总结

特性/版本JDK 17JDK 21
LTS 支持
虚拟线程不支持支持
字符串模板不支持支持(预览特性)
记录模式不支持支持
Scoped Values不支持支持(预览特性)
矢量化计算支持(预览特性)支持(正式特性)
外部函数和内存 API支持(预览特性)支持(正式特性)
垃圾回收器优化ZGC 和 G1 GC 优化Generational ZGC,进一步优化

选择建议

  • JDK 17:适合需要稳定性且不需要最新特性的项目。
  • JDK 21:推荐用于现代化开发,支持更多语言特性和性能优化,适合长期支持的生产环境。