作为主流的服务器端开发语言之一,开发高并发的应用一直是 Java 核心的应用场景。线程是 Java 中并发的基本单元。开发高并发的应用,离不开对线程的高效使用。很多人一听到多线程开发,就有种头大的感觉。但是,在日常开发中都会直接或间接地与线程打交道。线程是绕不开的难题。
异步多线程方式的可伸缩性更好,可以达到很高的性能。但问题是对开发人员太不友好,代码的可读性很差,调试和性能调优都非常困难。在这一点上,使用过反应式编程(Reactive Programming)框架的人都应该深有体会。除此之外,反应式编程框架对代码的侵入性很强,一旦用了之后就很难迁移到其他方式。
所以,Java 开发人员面临一个两难的处境。为了应用的性能,不得不硬着头皮去应对复杂的多线程开发。有了虚拟线程之后,Java 开发人员终于有了一个两全其美的选项。那就是,以同步方式来编写,以异步方式来运行。
线程的API java.lang.Thread 从 Java 1.0 就已经存在。Java 的早期版本使用的是绿色线程。绿色线程由虚拟机来调度,在不依赖操作系统支持的情况下,模拟出多线程的环境。实际上,早期的虚拟机实现仅使用单个操作系统线程。绿色线程在 Java 1.2 和 1.3 的时候退出了历史舞台。也就是在那个时候,Thread 类进行了一次比较大的修改,废弃了几个不安全的线程方法,包括 stop() 、suspend() 和 resume()。从那之后,Java 并没有对线程实现进行大的改动,直到 Java 19 中以预览功能的形式首次引入了虚拟线程(virtual thread)。从某种程度上来说,这意味着绿色线程的回归。
在 Java 19 之前,Java 中只有一种线程。现在称之为平台线程(platform thread)。平台线程是底层操作系统提供的线程实现的一个封装。每个平台线程都有一个操作系统的内核线程与之对应。
对操作系统来说,线程是一个稀缺资源。与之对应的 Java 平台线程也同样是稀缺资源。这种稀缺性体现在每个操作系统所能支持的线程数量存在一个上限。每个线程创建的成本比较高。创建线程也比较耗时。
由于线程的稀缺性,应用程序在使用线程时就必须非常谨慎。为了达到最佳的性能,必须对有限的线程的使用方式进行精细的控制。我们在日常开发中经常使用的一些多线程技术,其根源都在于线程的稀缺性。
- 因为线程是稀缺的,创建的成本较高,所以需要使用线程池。线程池的本质是稀缺资源的复用。
- 对于处理海量请求的服务器来说,不可能对每个请求都创建一个平台线程来处理。
反应式编程框架通过非阻塞 I/O和异步编程模式,能够达到极高的性能。但是换来的是复杂和难以理解的编程模型。
设想一下,如果线程不再稀缺,想用多少就可以用多少,那很多困扰多线程开发的问题就不复存在了。
- 当线程数量不再是个问题,就不再需要线程池来复用。在需要的时候创建线程,任务执行完成之后自动销毁。
- 在实现 Web 服务器时,每个请求直接用一个线程来处理。再也不需要复杂的线程切换,可以极大地简化代码的开发和调试。
有了虚拟线程之后,这就变成了现实。
有句话叫:贫穷限制了你的想象。这句话对 Java 应用的线程也是适用的。线程数量限制了 Java 的多线程开发。当缺钱的时候,总是不得不精打细算,把有限的资源投入到更重要的事情上;当金钱不再是问题时,考虑很多问题时就会简单很多。线程的数量也是一样的。当线程数量受限时,应用就必须采用复杂的方式来管理这些线程,以达到最佳的性能。当线程数量不再是一个问题时,处理线程就可以很随意。代码实现会简单很多,代码的可读性和可维护性也会大大提升。
当然了,虚拟线程也不是万灵药。虚拟线程只适合于 I/O 等待较多的场景,对于 CPU 密集的场景并不适用。
虚拟线程的出现,对 Java 多线程开发是一个巨大的改进。虚拟线程将是 Java 的一个杀手锏特性。之后的多线程开发,离不开对虚拟线程的了解。
虚拟线程在 Java 21 中成为正式功能。Java 21 是 Java 目前最新的 LTS 版本,也是很多 Java 应用升级的目标版本。即便是没有升级到 Java 21,提早学习和掌握虚拟线程,可以让你在今后的开发中把握先机。
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/76367.html