Java的绿色线程、原生线程/内核线程与虚拟线程的区别

Java 21将会正式推出尝试已久的虚拟线程技术,国内外已经有了很多报道。大约从Java 14开始,就开始引入尝鲜版的技术,当时叫什么的都有,虚拟线程,纤程或轻量级线程。看起来,以后会叫虚拟线程。由于写新闻的这些人,年龄不够大,文章跟测评都写的很好,但是没有见过Java以前的样子,感觉没有抓住本质,我尝试从历史的角度来写一下这玩意的进化史。

先从Java 1.0那个年代算起吧,那时候是1995年,硬件没有双核,软件以Linux为例,2003年前的Linux不支持线程。当时Linux可以用进程来模拟线程,用的是LinuxThreads这个线程库,但是总归有诸多的缺陷。

而Java呢,在没有双核/多核,没有操作系统支持线程的情况下,竟然支持了线程。你可能会问,都没有双核/多核,你支持线程有什么用呢?还是有用处的,可以并发运行,比如在等待打印机的时候,我们可以玩一把游戏,提高电脑并发的速度。因为当时都是单核,而多核要在2005年以后才出现。Java如何做到的呢?把线程做到JVM(Java虚拟机)中。要不然能怎么办?当时JVM自己就一个主线程。这样做的好处是:就算不支持多线程的操作系统(当年的Linux)也可以用上Java的“绿色”线程。缺点越来越明显:因为后来支持多核了,你就一个主线程,那肯定没法用上多核心啊。

后来操作系统都支持多线程了(Linux 2.6之后),大家也都用扣肉,4核,8核,32核的CPU了,绿色线程的模型越来越不好用了,于是,Java改成了线程交给操作系统来管理,将Java线程映射为操作系统级别的线程。这种线程模型也通常被称为”原生线程”或”内核线程”。

然而,操作系统线程也有其缺点。比如,创建、销毁和切换线程都需要消耗相当多的资源,因此在一个系统中同时存在的线程数量是有上限的。此外,大量的线程可能会导致线程调度器过载,从而影响系统的性能。

那怎么办呢?那就再把线程管理收归“Java虚拟机”所有啊!这次新发布的虚拟线程是在Java虚拟机(JVM)内部实现的,它们比操作系统线程更轻量级,创建和切换的成本更低。虚拟线程并不直接映射到操作系统线程,而是由JVM和运行时系统调度和执行。因此,可以在一个系统中创建大量的虚拟线程,而不会对系统性能产生太大的影响。

感觉像转了一圈:最初的绿色线程是由JVM管理的,后来为了追求性能,又交给了操作系统,后来操作系统又成了系统的瓶颈,JVM又收回了线程的管理。但是,这个圆圈可不是原地踏步,而是螺旋上升的。

0 0 投票数
文章评分
订阅评论
提醒

4 评论
最旧
最新 最多投票
内联反馈
查看所有评论
cj.zhang
9 月 前

栋哥:您这是否在科普mate60pro鸿蒙系统更新后,8核心变12核心的原理啊?

dirtysalt
9 月 前

栋哥感觉这个虚拟线程可以把go routine和erlang process干爬下吗?

4
0
希望看到您的想法,请您发表评论x
滚动至顶部