【Java】你应该知道的JDK19新特性

JDK19新特性初体验 JDK19新特性实战练习 阅读详情

9月20日,JDK19 终于在千呼万唤中正式发布,随之发布的新特性中包括了最为广受期待的虚拟线程,以改善多线程、并发编程难度。

在这里插入图片描述

1 前言

1.1 哪些新特性

本次 JDK19 中带来了 7 个新特性:

更多详细介绍推荐去阅读原文,本文仅从笔者自身代码编写的角度出发,展示有哪些全新的代码结构、书写方式被支持。

1.2 本地编译运行

JDK19 虽然已经发布,但目前 Idea 还没有支持到 JDK19,所以只能用命令行的方式编译运行:

javac --release 19 --enable-preview -Xlint:preview Main.java
java --enable-preview Main

2 记录模式(Record Patterns)

record 关键字首次在 JDK14 中出现,它允许用一种更简单的方式去构造一个不可变对象。

记录模式可以极其方便去编写一个 pojo 类,比如之前需要这么编写的一个拥有属性 x 和 y 的 Point 类:

class Point{
    private int x;
    
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

使用 record 关键字后,只需要写一行代码即可实现上述 pojo 类声明:

record Point(int x, int y) {}

而在 JDK19 中进一步增强了记录模式,不仅可以使用 instanceof 来进行对象类型的判断,还可以直接从 x、y 中获取值:

record Point(int x, int y) {}

void printSum(Object o) {
    if (o instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

当然,在这种思想下,我们还可以编写出拥有嵌套多层的代码从而匹配更加复杂的对象。

3 外部函数和内存 API(Foreign Function & Memory API

在此之前,开发者如果想在 Java 代码中调用外部代码或者操作外部内存(JVM 之外的内存),只能通过JNI(Java Native Interface)的方式进行操作,这种方式主要就是通过调用 C、C++代码来进行实现,这种方式是危险且脆弱的。而在 JDK19 中引入了一个 API 来解决 JNI 这种脆弱且危险的调用方式。

// 1. Find foreign function on the C library path
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle radixSort = linker.downcallHandle(stdlib.lookup("radixsort"), ...);
// 2. Allocate on-heap memory to store four strings
String[] javaStrings   = { "mouse", "cat", "dog", "car" };
// 3. Allocate off-heap memory to store four pointers
SegmentAllocator allocator = SegmentAllocator.implicitAllocator();
MemorySegment offHeap  = allocator.allocateArray(ValueLayout.ADDRESS, javaStrings.length);
// 4. Copy the strings from on-heap to off-heap
for (int i = 0; i < javaStrings.length; i++) {
    // Allocate a string off-heap, then store a pointer to it
    MemorySegment cString = allocator.allocateUtf8String(javaStrings[i]);
    offHeap.setAtIndex(ValueLayout.ADDRESS, i, cString);
}
// 5. Sort the off-heap data by calling the foreign function
radixSort.invoke(offHeap, javaStrings.length, MemoryAddress.NULL, '\0');
// 6. Copy the (reordered) strings from off-heap to on-heap
for (int i = 0; i < javaStrings.length; i++) {
    MemoryAddress cStringPtr = offHeap.getAtIndex(ValueLayout.ADDRESS, i);
    javaStrings[i] = cStringPtr.getUtf8String(0);
}
assert Arrays.equals(javaStrings, new String[] {"car", "cat", "dog", "mouse"});  // true

4 虚拟线程(Virtual Threads)

Java 终于可以原生支持虚拟线程了,对于 IO 密集型任务,使用虚拟线程可以带来更高的并发和更低的系统消耗从而来提高更大的吞吐量。

此次在 Thread 类中新增加了一个工厂方法 ofVirtual(),通过该方法可以很方便的创建虚拟线程。在具体使用上,感觉虚拟线程和目前真实线程方法和使用没有太大区别。

// 声明虚拟线程
Thread ofVirtual = Thread.ofVirtual().start(new Runnable() {
    public void run() {
        System.out.println("this is Thread.ofVirtual()");
    }
});

// 声明虚拟线程池
ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();

据官方数据说明,使用虚拟线程池,可以轻松支持 10000 个虚拟线程的并发,并且在 OS 层仅仅是用了少数的真实线程,可能在 OS 层仅仅使用一个线程!!!

官方原文:can easily support 10,000 virtual threads running,Behind the scenes, the JDK runs the code on a small number of OS threads, perhaps as few as one.

5 Switch 的模式匹配(Pattern Matching for Switch)

JDK19 中也进一步增强了switch的匹配模式,比如之前我们如果要进行对象类型匹配,可能会编写以下代码:

public String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

而在新版本中,可以通过 switch 的箭头表达式来简化上述代码:

public String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

同时还支持 null 值和多值匹配:

public void testFooBar(String s) {
    switch (s) {
        case null         -> System.out.println("Oops");
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    }
}

甚至还支持了 case when 语句:

// 在此之前需要在 case 中通过 if 判断
public void test(Object o) {
    switch (o) {
        case String s:
            if (s.length() == 1) { ... }
            else { ... }
            break;
        ...
    }
}

// 现在可以直接通过 when 语法实现
public void test(Object o) {
    switch (o) {
        case String s when s.length() == 1 -> ...
        case String s                      -> ...
        ...
    }
}

6 结构化并发编程(Structured Concurrency)

在 JDK19 中提出了 Java 的结构化并发编程实现方式,但目前仍是孵化器阶段,简单来理解,我们可以将所有线程的生命周期声明在一个 scope 中,并且通过 scope 的控制来控制线程。

 Response handle() throws ExecutionException, InterruptedException {
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        Future<String>  user  = scope.fork(() -> findUser());
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();           // Join both forks
        scope.throwIfFailed();  // ... and propagate errors

        // Here, both forks have succeeded, so compose their results
        return new Response(user.resultNow(), order.resultNow());
    }
}

7 结语

从 Java 出现至今,已经走过了 20 多个年头,不断出现的新特性相信必将给 Java 带来更强的生命力和更大的应用场景,同时 Java 也在不断挑战并拓展着自身的边界,虽然本次发布的 JDK19 并不是 LTS 版本,只有 6 个月的支持期,但其带来的新特性尤其是虚拟线程依然是非常重磅的。

JDK19特性 JDK19 新特性 阅读详情

相关推荐

Java 19新特性:虚拟线程(Virtual Threads )

JDK19马上就要发布了,今天我们来谈一谈JDK 19新特性虚线程,它属于JEP 425 Project Loom(425:)。这可能是JDK 19中最值得期待的预览特性之一。我们知道Java阻塞平台线程的代价很高,这就是为什么要不惜一切代价避免这种情况,以及为什么要基于回调编写响应式代码。响应式代码做得很好,但它使代码难以阅读和测试,这显然不是理想的情况。使用DK9和虚拟线程,阻塞线程变得如此廉价,以至于我们不再需要编写响应式代码,我们 的老式阻塞同步代码也可以很好地工作!

XiumingLee的博客 6576

JDK 19 协程新特性:Project Loom 项目的延续

探讨了协程的定义、发展史和 JDK 19 中的实现原理。协程是一种轻量级的并发编程工具,通过 Continuation 控制流、Scheduler 调度和阻塞操作的改造,实现了非阻塞、高效的并发编程。历史回顾包括协程在不同编程语言中的应用和 Java 协程的发展。JDK 19 中的协程原理深入分析了创建协程的方法、非阻塞 IO 改造、Continuation 的作用以及协程的唤醒机制。总结了协程的核心原理和重要组件。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

JDK 17 和JDK 8 相比新特性

因此,在使用 Vector API 时,开发人员需要注意相应的限制和注意事项,并进行适当的测试和优化,以确保代码的正确性和性能。Vector API 的设计基于 Java 语言和 Java 虚拟机的现有基础,因此开发人员可以使用熟悉的 Java 语言和工具来编写和调试使用向量操作的代码,同时利用硬件的 SIMD 功能获得更高的性能。除此之外,JDK 17还包括一些改进和优化,如:ZGC 改进,G1 改进,统一的 JVM 日志系统,可过滤的 JVM 日志,强化了java.net.URL 类的安全性等。

javajy的博客 1617

Java19新特性

Java19 新特性

wang_luwei的博客 1500

JDK19 版本的重要特性

JDK 18 一样,JDK19 将是一个短期版本,只有六个月的顶级Premier 支持。之前的版本JDK 17 是离JDK19最近的一个长期支持(LTS)版本,提供了数年的支持。JDK19 中主要的7个新特性中,最具 Java 开发者垂涎已久的新特性—— 虚拟线程,类似 Go 语言的协程。

u014695938的博客 4284

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK19特性讲解】

JDK19新特性介绍

波波烤鸭的博客 6672

JDK19新特性

JDK19新特性

蓝影铁哥的博客 1755

JDK17至JDK19的核心新特性

以下是。

一叶之秋的博客 3942

各个版本jdk新特性

各个版本jdk新特性

wrxfxdd的博客 3339

Java基础系列】JDK21新特性

JDK 21 已经于 2023 年 9 月 19 日正式发布。本文总结了 JDK 21 发布的新特性。根据发布的规划,这次发布的 JDK 21 将是一个长期支持版(LTS 版)。LTS 版每 2 年发布一个,上一次长期支持版是 21 年 9 月发布的 JDK 17。不能抱有你强任你强,我用 java8 的思想。

CSDN站内信: https://i.csdn.net/#/msg/chat/qyj19920704 2万+

JDK 19: Java 19中的新特性(原文详解)

现在可以用于生产,Java 19具有结构化并发性、虚拟线程、开关表达式的模式匹配、向量API和Linux/RISC-V端口。在Facebook上分享在Twitter上分享在LinkedIn上分享在Reddit上分享通过电子邮件分享打印资源保罗·克里尔著自由编辑,InfoWorld |, 2022年9月20日8:10 PDT上午。

qq_39395109的博客 5115

JDK19新特性使用详解

JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。

2401_87878486的博客 1084

Java 18&Java 19新特性概述

通过高效调用外部函数(即 JVM 外部的代码)和安全访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会出现 JNI 的脆弱性和危险性。前面也提到过,在没有外部函数和内存API之前,开发人员如果想要操作堆外内存,通常的做法就是使用ByteBuffer、Unsafe或JNI等方式,但无论哪种方式都无法有效解决安全性和高效性等2个问题,并且堆外内存的释放也是一个头疼的问题。End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。

让~学习~成为一种习惯(橡 皮 人の技术博客) 2881

Java19的主要新特性总结

JDK 19 于2022 年 9 月 20 日正式发布。JEP(Java Enhancement Proposal)Java增强提案CSR(Compatibility & Specification Review) 兼容性和规范审查JEP 427这仍然是一个预览特性。

donggongai的博客 1万+

java学习——详解Java19新特性

Java 引入虚拟线程,虚拟线程是 JDK 实现的轻量级线程,它在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。Record Patterns 可对 record 的值进行解构,Record patterns 和 Type patterns 通过嵌套能够实现强大的、声明性的、可组合的数据导航和处理形式。虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。

a25847a的博客 5717

JDK21新特性

JDK21新特性

蓝影铁哥的博客 1万+

Java新特性梳理——Java19

highlight: xcode theme: vuepress 概述 JDK 19 于 2022 年 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。 JDK 19 只有 7 个新特性: JEP 405: Record Patterns(记录模式)[1] (预览) JEP 422: Linux/RISC-V Port[2...

weixin_45254062的博客 1万+
上一篇: MySQL是如何实现事务的——锁机制、MVVC详解
下一篇: 【Python】京东自动下单抢购脚本——双十一购物小技巧
程序猿周周
程序猿周周 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄10年 1万+粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿周周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值