JDK21 新特性

2024-02-23 23:44
文章标签 特性 jdk21

本文主要是介绍JDK21 新特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 1. 虚拟线程(Virtual Threads)
    • 2. 有序集合(Sequenced Collections)
    • 3. switch 的模式匹配(Pattern Matching for switch)
    • 4. 记录模式(Record Patterns)
    • 5. ZGC
    • 6. 准备禁用动态代理(Prepare to Disallow the Dynamic Loading of Agents)

1. 虚拟线程(Virtual Threads)

https://openjdk.org/jeps/444

  • 虚拟线程是工作在平台线程之上的,虚拟线程的数量可以远大于操作系统线程的数量,多个虚拟线程挂载在一个平台线程上,一个平台线程可以在不同的时间执行不同的虚拟线程,当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。

请添加图片描述

注意事项:

  1. 虚拟线程主要作用是提升服务器端的吞吐量,而不是提高线程的执行速度。
  2. 虚拟线程只适合IO密集型的任务,阻塞期间可以将CPU资源让渡给其他任务,不适合CPU密集型的任务或非阻塞任务。
  3. 虚拟线程是廉价且轻量级的,使用完后立即被销毁,因此不需要池化。
  • 创建虚拟线程的方法
import lombok.extern.slf4j.Slf4j;import java.time.Duration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.stream.IntStream;@Slf4j
public class Demo {public static void main(String[] args) throws Exception {Runnable task = () -> {log.info(Thread.currentThread().toString());};// 1. 通过 Thread.ofVirtual() 创建Thread thread = Thread.ofVirtual().name(Thread.currentThread().toString()).start(task);// 2. 通过 Thread.startVirtualThread() 创建Thread.startVirtualThread(task);// 3. 通过 ThreadFactory 创建ThreadFactory factory = Thread.ofVirtual().factory();Thread newThread = factory.newThread(task);newThread.start();// 4. 通过 Executors.newVirtualThreadPerTaskExecutor() 创建try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 5).forEach(i -> {executor.submit(() -> {log.info("{}, before", Thread.currentThread());try {Thread.sleep(Duration.ofSeconds(1));} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("{}, after", Thread.currentThread());});});}System.in.read();}}
  • 打印
19:49:16.027 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#22]/runnable@ForkJoinPool-1-worker-2
19:49:16.027 [Thread[#1,main,5,main]] INFO org.example.virtual_thread.Demo -- VirtualThread[#20,Thread[#1,main,5,main]]/runnable@ForkJoinPool-1-worker-1
19:49:16.029 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#23]/runnable@ForkJoinPool-1-worker-2
19:49:16.029 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#25]/runnable@ForkJoinPool-1-worker-1, before
19:49:16.030 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#27]/runnable@ForkJoinPool-1-worker-2, before
19:49:16.029 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#26]/runnable@ForkJoinPool-1-worker-2, before
19:49:16.031 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#28]/runnable@ForkJoinPool-1-worker-1, before
19:49:16.031 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#29]/runnable@ForkJoinPool-1-worker-1, before
19:49:17.033 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#27]/runnable@ForkJoinPool-1-worker-1, after
19:49:17.033 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#25]/runnable@ForkJoinPool-1-worker-2, after
19:49:17.033 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#28]/runnable@ForkJoinPool-1-worker-2, after
19:49:17.033 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#26]/runnable@ForkJoinPool-1-worker-1, after
19:49:17.033 [] INFO org.example.virtual_thread.Demo -- VirtualThread[#29]/runnable@ForkJoinPool-1-worker-2, after
  • 通过25号虚拟线程可以看出,阻塞前后使用的平台线程发生过切换

在这里插入图片描述

  • VirtualThread[#22]/runnable@ForkJoinPool-1-worker-2表示VirtualThread[#22]这个虚拟线程依赖于平台线程ForkJoinPool-1-worker-2,这里我在VM参数中添加了-Djdk.virtualThreadScheduler.maxPoolSize=2 -Djdk.virtualThreadScheduler.parallelism=2,限制平台线程最大2个,所以只能会看到ForkJoinPool-1-worker-1和ForkJoinPool-1-worker-2两个平台线程。

在这里插入图片描述

  • 虚拟线程在block后,会与平台线程解绑,然后加入任务列表排队,等待分配给平台线程

在这里插入图片描述

2. 有序集合(Sequenced Collections)

https://openjdk.org/jeps/431

  • Sequenced Collections是一种具有确定出现顺序的集合。提供了处理集合第一个和最后一个元素以及反转集合的简单方法。

Sequenced Collections 包括以下三个接口:

  1. SequencedCollection
  2. SequencedSet
  3. SequencedMap

在这里插入图片描述

interface SequencedCollection<E> extends Collection<E> {// New MethodSequencedCollection<E> reversed();// Promoted methods from Deque<E>void addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}

3. switch 的模式匹配(Pattern Matching for switch)

https://openjdk.org/jeps/441

  • 属于语法方面的升级,增强了 switch 表达式,允许在 case 标签中使用模式。
  • JDK21之前
// Prior to Java 21
static String formatter(Object obj) {String formatted = "unknown";if (obj instanceof Integer i) {formatted = String.format("int %d", i);} else if (obj instanceof Long l) {formatted = String.format("long %d", l);} else if (obj instanceof Double d) {formatted = String.format("double %f", d);} else if (obj instanceof String s) {formatted = String.format("String %s", s);}return formatted;
}
  • JDK21之后
// As of Java 21
static String formatterPatternSwitch(Object obj) {return switch (obj) {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        -> obj.toString();};
}

4. 记录模式(Record Patterns)

https://openjdk.org/jeps/440

  • 记录模式(Record Patterns) 可对 record 的值进行解构,也就是更方便地从记录类(Record Class)中提取数据。并且,记录模式和类型模式可以嵌套使用,以实现强大的、声明性的和可组合的数据导航和处理形式。
  • 记录模式不能单独使用,而是要与 instanceof 或 switch 模式匹配一同使用。
  1. 以 instanceof 为例
// As of Java 16
record Point(int x, int y) {}static void printSum(Object obj) {if (obj instanceof Point p) {int x = p.x();int y = p.y();System.out.println(x+y);}
}
// As of Java 21
static void printSum(Object obj) {if (obj instanceof Point(int x, int y)) {System.out.println(x+y);}
}

5. ZGC

https://openjdk.org/jeps/439

  • ZGC是一款低延迟、高吞吐的JVM垃圾回收器。JDK11试验版本,JDK15变为生产版本,但都是不分代的,所有的对象都存储在一起,每次垃圾回收都要回收所有对象。
    在JDK21中区分年轻代和老年代,因为年轻代的对象存活时间更短,所以 通过提高收集年轻代的对象的频率迅速释放JVM内存。

  • 默认不开启ZGC,可以使用以下命令开启

java -XX:+UseZGC -XX:+ZGenerational 

6. 准备禁用动态代理(Prepare to Disallow the Dynamic Loading of Agents)

https://openjdk.org/jeps/451

  • 当代理被动态加载到运行中的 JVM 时发出警告。这些警告的目的是让用户做好准备,以便在未来的版本中默认禁止动态加载代理。
    动态代理允许开发人员在运行时修改和监视Java应用程序,存在潜在的安全风险,例如窃取敏感信息、篡改数据等。因此,为了加强Java应用程序的安全性,限制动态加载代理的使用是有必要的。

这篇关于JDK21 新特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740316

相关文章

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置