jdk 21 virtual thread doc reading
心得
- java的最初的线程模式是
thread-per-request style
,即每一个请求都使用一个线程去执行,这样的好处是资源独立,debugger,profile等方便获取。但是由于此时java的thread和操作系统的thread的基本上是一一对应的,而受限于操作系统的硬件限制,无法同时创造过多的thread,而创造和销毁thread的开销又十分巨大,所以此时的thread的并发性能并不理想 - 基于此,引入了thread pool和asynchronous
- thread pool 因此thread的创造和销毁开销巨大,那么就让thread的lifestyle拉长,多个task可以顺序地共用同一个线程。但是这个还是没办法避免掉线程并发数量上限低的问题
- asynchronous,这个更多的是一种思想。
- 对于一个request,其中最耗时的部分可以分为:cpu计算和io
- cpu计算是受限于计算机的硬件,通过并发是没有办法显著提升性能
- io(网络io)不受限于计算机,而是依赖一些外部资源,这个提升并发可以提升处理速度
- asynchronized的思路就是需要开发者对request进行逻辑拆分,把计算和io部分拆分开,对io部分逻辑手动分配更多的并发线程资源,从而让整体的处理资源分配更加合理,通常会使用CompletableFuture这种异步编排的方式来加快request的处理速度
- 这种方式固然可以加速请求的处理效率,但是额外引入的更多的复杂度,而且request的多个部分由不同的线程来处理,对于排障和问题定位无疑是巨大挑战
- virtual thread
- 就像操作系统引入虚拟内存来使程序可以使用更大的内存,jdk21引入virtual thread来避免操作系统本身对thread的限制
- virtual thread的创造和开销极小
- virtual thread可以兼容绝大部分已有的线程使用方式,(可能只需要极小的改变)
- virtual thread又回归到
thread-per-request style
模式,减少复杂度。 - virtual thread的内部原理有点像asynchronous,对于io部分进行阻塞等待,所以如果是io密集型的request,使用virtual thread会获取极大的并发提升,因为此时可以并发执行,但是对于cpu密集型的request,virtual thread的并发效果并没有预期那么大,因为本质都是需要计算机cpu资源,这个并不会因为并发的提升而提升
- Observing virtual threads
- thread dump不在适用,因为百万级别的thread list对用户是不可读的,jdk21听过jcmd命令提供一种更具可读性的thread dump
- Scheduling virtual threads
- 不同于系统thread的调度方式,jdk21由一个carrier去调度virtual thread :The JDK’s virtual thread scheduler is a work-stealing
ForkJoinPool
that operates in FIFO mode. The parallelism of the scheduler is the number of platform threads available for the purpose of scheduling virtual threads.The platform thread to which the scheduler assigns a virtual thread is called the virtual thread’s carrier. - 在java代码视角上看,carrier 和 virtual thread 彼此独立;在native代码视角上看,二者均运行在同一个os thread上。In addition, from the perspective of Java code, the fact that a virtual thread and its carrier temporarily share an OS thread is invisible. From the perspective of native code, by contrast, both the virtual thread and its carrier run on the same native thread.
- 不同于系统thread的调度方式,jdk21由一个carrier去调度virtual thread :The JDK’s virtual thread scheduler is a work-stealing
jdk 21 virtual thread doc reading
http://coder-xieshijie.cn/2023/09/19/随笔/doc reading/jdk-21-virtual-thread-doc-reading/