![]()
🏷️个人主页:牵着猫散步的鼠鼠
🏷️系列专栏:Java全栈-专栏
🏷️个人学习笔记,若有缺误,欢迎评论区指正
目录
1.前言
我们现在在国内的大部分企业中使用的Java版本还是8居多,Java21是Oracle公司于2023年9月20号发布的版本,是一个最新且会被长期维护的稳定版本,很少有面试官会针对这部分更新内容着重拷问,但是!若你遇到了面试官或者公司的项目刚好在用Java21,那它的相关特性你就必须要知道了!而Java21带来的重磅内容就是虚拟线程。今天我们就抽个时间来聊一聊它。
2.虚拟线程的诞生背景
虚拟线程在Java19时被作为预览特性提出,经过了2个版本的迭代后,在Java21成功上位,是一个十分重要的新增特性,对于I/O密集型程序的性能带来了大幅度的提升!
随着企业应用的规模壮大,大量的网络请求或读写I/O场景越来越多,这种情况下,很多语言如Go、C#、Erlang、Lua等,都有“协程”来优化性能,曾经我们 Java 开发者面对这种平凡而又高级的技术只能干瞪眼,遇到I/O密集型程序,我们只能通过多线程来优化,实际上这种优化的效果有限,使用不当还会带来OOM问题,但在Java21推出虚拟线程后,一扫沉疴!虚拟线程的特性让它对高IO场景得心应手。
- I/O密集型程序: 指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,但CPU的使用率不高。具体场景如读文件、写文件、传输文件、网络请求。
- CPU密集性程序: 也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。具体场景如科学计算、图像处理和加密解密等。
3.什么是虚拟线程
那么什么是虚拟线程呢?在搞清楚这个定义之前,我们先来了解一下普通线程,基于过往的学习积累,我们知道JVM 是一个多线程环境,它通过 java.lang.Thread 为我们提供了对 操作系统线程(OS线程) 的抽象,但是 Java 中的线程都只是对操作系统线程的一种简单封装,我们可以称之为 “平台线程(platform thread)” ,平台线程在底层 OS 线程上运行 Java 代码,并在代码的整个生命周期中占用该 OS 线程,因此平台线程的数量受限于 OS 线程的数量。
而虚拟线程是Thread的一个实例,虽然也在OS线程上运行Java代码,但它不会在整个生命周期内都占用该OS线程,换句话说,一个OS线程上支持多个虚拟线程的运行,因此,同样的操作系统配置下,可以创建更多的虚拟线程数量,执行阻塞任务的整体吞吐量也就大了很多。
虚拟线程: Java 中的一种轻量级线程,它旨在解决传统线程模型中的一些