你发任你发 我用 JAVA8 哈哈哈哈哈哈哈 不过这次的 21 还是很有特点

Virtual Threads(核心功能💢)

Virtual Threads 提供了一种更高效,更轻量级的线程模型。一般来说线程可执行的数量是跟 CPU 核心数量相关的,但是 Virtual Threads 不是这样的,它可以创建大量的线程,而不会导致 CPU 资源的浪费,这种线程模型的好处是可以在不增加 CPU 资源的情况下创建大量的线程,这对于高并发的应用程序来说是非常有用的

线程的成本消耗分两个大部分,一部分是创建与销毁,另一部分是频繁切换,数量越多,切换就越频繁。创建与销毁在之前就可以用线程池来管理线程 共享线程来解决。而频繁切换的问题,就是因为线程的数量太多,导致 CPU 资源被消耗在了线程切换上,而不是真正的业务逻辑上。而 Virtual Threads 就是为了解决这个问题而生的。多个虚拟线程对应一个真正的线程本质上是3个虚拟线程在执行实际上它只是在一个线程里它本身没有切换那它就没有切换的成本,这样的话,它的速度就会很快,再有的话就是并发量有极大的几何式提升,因为虚拟线程的创建成本很低,如果你的硬件足够好的话,可以有上百万个虚拟线程都可以,但是真正的物理线程是不可能达到的

举个例子,对于微博来说它的并发量是很大的,而使用虚拟线程之后假设它的性能提高了 30%,那也就意味着微博的成本降低了 30%,降低运营成本,提高利润,这对于企业来说是非常有吸引力的。虚拟线程代码层面兼容性极好,基本和原来的线程池是一样的

1
2
3
try (ExecutorService executor = Executors.newVirtualThreadExecutor()) {
executor.submit(() -> System.out.println("Hello, World!"));
}

Sequenced Collections

Java 的集合框架缺少表示具有已定义顺序的元素列表。它也缺少一个适用于此类集合的统一操作集。这些一直是问题和抱怨的反复来源

1
2
3
4
5
6
7
8
9
10
11
interface SequencedCollection<E> extends Collection<E> {
// new method
SequencedCollection<E> reversed();
// methods promoted from Deque
void addFirst();
void addLast();
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}

Deprecate the Win32-bit Port for Removal

  • 废弃 Windows 32 位 x86 版本,将在以后的 OpenJDK 版本中删除
  • Windows 10,支持 32 位的最后一个 Windows 操作系统,将在 2025 年 10 月终止。结束对 Windows 32位 x86 版本的支持,可以把精力转移到更加重要的事情上
  • 虚拟线程在 Windows 32 位 x86 版本的实现回退到了使用内核线程,没办法享受到 Loom 项目带来的好处

Prepare to Disallow the Dynamic Loading of Agents

准备禁止动态加载代理

Generational ZGC

通过扩展 ZGC 垃圾回收器来提高应用程序性能,区分年轻代和老年代分开垃圾回收。对于通过高频率的垃圾回收可以迅速释放 JVM 内存,从而提升性能

为什么 ZGC 出了 5 年了才有分代收集

因为 ZGC 分代实现起来麻烦,所以先实现了一个比较简单可用的版本。然后时隔 5 年才弄出了分代 GC。5 年啊,可想而知这个算法是多么复杂

Pattern Matching for switch

增强 Java 中的 switch 表达式和语句,允许在 case 标签中使用模式。当模式匹配时,执行 case 标签对应的代码

Record Patterns

Record Patterns的实现原理主要涉及两个方面:

  • 记录类型 记录类型是一种新的类声明形式,通过 record 关键字来定义
  • 模式匹配 模式匹配是指根据给定的模式来匹配某个对象,并执行相应的操作。在 Record Patterns 中,我们可以使用 instance of 关键字和模式变量来进行模式匹配。具体地说,当我们使用 Record Patterns 进行模式匹配时,编译器会自动为记录类型生成一个模式匹配方法,这个方法接受一个对象作为参数,并根据给定的模式进行匹配。如果匹配成功,则将字段值绑定到相应的模式变量中,从而可以在后续的代码中使用
1
2
3
if (obj instanceof Point p) {
System.out.println(p.x() + "," + p.y());
}

Key Encapsulation Mechanism API

密钥封装机制 API。通常用于非对称密码学中的密钥交换过程,以安全地生成和交换共享密钥

总结

以上就是 JDK21 的新特性,其中核心最重要的就是虚拟线程,其他的都是一些小的特性,但是也是很有用的,比如 Pattern Matching for switch、Record Patterns、Key Encapsulation Mechanism API 等等,这些都是很有用的特性,但是虚拟线程是最重要的,因为它可以提升性能,提升并发量,降低成本,这对于企业来说是非常有吸引力的

除此之外还有很多预览和展望的功能,比如 Unnamed Classes and Instance Main Methods,String Templates,这些在后面版本中可能会出现,也可能不会出现,但是这些都是很有意思的特性,值得我们去关注,在这里我就不一一赘述了,感兴趣的小伙伴可以去看看