Java 最新发布版本有哪些变化?
JDK21 在今年 9 月份(也就是 2023 年 9 月)就要正式发布了。和之前版本有哪些不同?
JDK 21 这个版本将是 Java SE 平台版本 21 的参考实现,由 Java 社区进程中的 JSR 396 指定。目前 JDK 21 处于第二阶段的降级阶段,整个特性集已经冻结,并且没有进一步的 JEP 将会针对该版本进行开发。根据 JDK 发布流程(JEP 3),稳定版本库 jdk21 在获得批准后可以选择进行 bug 修复,但后期增强功能需要满足较高门槛。通过从主线版本库回移植大多数稳定版本更改来处理候选错误修复请求和后期增强请求。早期访问二进制文件可在 GPL 下获取。
日程安排如下:2023/06/08 第一阶段(从主线分叉)、2023 年 7 月 20 日第二阶段、2023/08/10 初次发布候选版、2023/08/24 最终发布候选版、2023/09/19 正式可用。
当前 Java 中的多线程并发编程绝对是令编程者都非常头疼的一部分,感觉就是学起来难啃,用起来难用。JDK21 中就在这方面做了很大的改进,让 Java 并发编程变得更简单一点,更丝滑一点。
那具体是什么呢?让我们来具体来看一下。下面是 JDK21 的 Feature。
特性
430:字符串模板(预览)
431:序列集合
439:分代 ZGC
440:记录模式
441:开关的模式匹配
442:外部函数和内存 API(第三次预览)
443:未命名模式和变量(预览版)
444:虚拟线程
未命名类和实例主方法(预览)
446:作用域值(预览)
448: vector API(第六个孵化器)
449:移除 Windows 32 位 x86 端口
451:准备禁止动态加载代理
452:密钥封装机制 API
453:结构化并发(预览)
其中 Virtual Threads、Scoped Values、Structured Concurrency 就是针对多线程并发编程的几个功能。我们今天也主要来说一下他们。
虚拟线程(Virtual Threads)
虚拟线程是基于协程的线程,它们与其他语言中的协程具有相似之处,但也存在一些不同之处。
虚拟线程是依附于主线程的,如果主线程销毁了,那虚拟线程也不复存在。
相同之处:
1. 虚拟线程和协程都是轻量级的线程,它们的创建和销毁的开销都比传统的操作系统线程要小。
2. 虚拟线程和协程都可以通过暂停和恢复来实现线程之间的切换,从而避免了线程上下文切换的开销。
3. 虚拟线程和协程都可以使用异步和非阻塞的方式来处理任务,提高应用程序的性能和响应速度。
不同之处:
1. 虚拟线程是在 JVM 层面实现的,而协程则是在语言层面实现的。因此,虚拟线程的实现可以与任何支持 JVM 的语言一起使用,而协程的实现则需要特定的编程语言支持。
2. 虚拟线程是一种基于线程的协程实现,因此它们可以使用线程相关的 API,如 ThreadLocal、Lock 和 Semaphore。而协程则不依赖于线程,通常需要使用特定的异步编程框架和 API。
3. 虚拟线程的调度是由 JVM 管理的,而协程的调度是由编程语言或异步编程框架管理的。因此,虚拟线程可以更好地与其他线程进行协作,而协程则更适合处理异步任务。
总的来说,虚拟线程是一种新的线程类型,它可以提高应用程序的性能和资源利用率,同时也可以使用传统线程相关的 API。虚拟线程与协程有很多相似之处,但也存在一些不同之处。
虚拟线程确实可以让多线程编程变得更简单和更高效。相比于传统的操作系统线程,虚拟线程的创建和销毁的开销更小,线程上下文切换的开销也更小,因此可以大大减少多线程编程中的资源消耗和性能瓶颈。
使用虚拟线程,开发者可以像编写传统的线程代码一样编写代码,而无需担心线程的数量和调度,因为 JVM 会自动管理虚拟线程的数量和调度。此外,虚拟线程还支持传统线程相关的 API,如 ThreadLocal、Lock 和 Semaphore,这使得开发者可以更轻松地迁移传统线程代码到虚拟线程。
虚拟线程的引入,使得多线程编程变得更加高效、简单和安全,使得开发者能够更加专注于业务逻辑,而不必过多地关注底层的线程管理。
结构化并发(Structured Concurrency)
结构化并发是一种编程范式,旨在通过提供结构化和易于遵循的方法来简化并发编程。使用结构化并发,开发人员可以创建更容易理解和调试的并发代码,并且不容易出现竞争条件和其他与并发有关的错误。在结构化并发中,所有并发代码都被结构化为称为任务的定义良好的工作单元。任务以结构化方式创建、执行和完成,任务的执行总是保证在其父任务完成之前完成。
Structured Concurrency(结构化并发)可以让多线程编程更加简单和可靠。在传统的多线程编程中,线程的启动、执行和结束是由开发者手动管理的,因此容易出现线程泄露、死锁和异常处理不当等问题。
使用结构化并发,开发者可以更加自然地组织并发任务,使得任务之间的依赖关系更加清晰,代码逻辑更加简洁。结构化并发还提供了一些异常处理机制,可以更好地管理并发任务中的异常,避免因为异常而导致程序崩溃或数据不一致的情况。
除此之外,结构化并发还可以通过限制并发任务的数量和优先级,防止资源竞争和饥饿等问题的发生。这些特性使得开发者能够更加方便地实现高效、可靠的并发程序,而无需过多关注底层的线程管理。
作用域值(Scoped Values)
作用域值是 JDK 20 中的一项功能,允许开发人员创建作用域限定的值,这些值限定于特定的线程或任务。作用域值类似于线程本地变量,但是设计为与虚拟线程和结构化并发配合使用。它们允许开发人员以结构化的方式在任务和虚拟线程之间传递值,无需复杂的同步或锁定机制。作用域值可用于在应用程序的不同部分之间传递上下文信息,例如用户身份验证或请求特定数据。
作为一个长期支持版本,JDK 21 将获得 5 年的主要支持和扩展支持,直到 2031 年 9 月。当前的 LTS 版本是 JDK 17,于 2021 年 9 月发布。非 lts 版本,如 JDK 20 和 JDK 19,只获得六个月的主要支持,没有扩展支持。LTS 每两年发布一次。
了解更多信息可加技术群(QQ721096495)讨论交流。
评论