Java将增加虚拟线程,挑战Go协程

我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制。一个 go 语句就可以发起一个协程 (goroutin)。
协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是由用户程序自行管理和调度。它寄存于线程中,系统开销极小,可以显著的提高性能和并发能力。使用协程的优点是运行效率高、编程简单、结构清晰。目前,原生支持协程的语言不是很多。

Oracle 本周提交的一份JDK增强建议(JEP)草案要求将虚拟线程作为Java标准版的一部分进行预览。
虚拟线程类似于 Go 语言的协程,将补充Java的平台线程(代表操作系统线程),采用轻量级的用户模式线程实现,将更有效地利用可用的硬件,并大大降低成本。
虚拟线程目的是更好地支持编写和维护高吞吐量并发应用程序。

该提案指出,线程对于代表一个并发单元(如事务)是很有用的。Java目前对Thread的实现是为每个Java线程消耗一个操作系统线程,而操作系统线程是稀缺和昂贵的。现代服务器的能力可以处理比操作系统线程更多数量级的并发事务。

编写高吞吐量服务器软件的开发者不得不在事务之间共享线程,以有效利用硬件。这是用线程池来完成的,它将线程借给一个又一个事务,以节省为每个事务创建线程的成本。当这还不够时,开发人员开始将线程返回到线程池中,甚至在事务的中间,在等待I/O的时候。但是,这导致了一种异步的编程风格,需要一套独立的、不兼容的API,并使故障排除、调试、观察和分析变得非常困难。


虚拟线程是java.lang.Thread的用户模式实现,它不会阻塞操作系统线程,能够实现接近最佳的硬件利用率。虚拟线程允许高水平的并发,以及高吞吐量,同时程序仍然与Java平台和工具的基于线程的设计相协调。虚拟线程对于平台线程来说,就像虚拟内存对于物理RAM一样:一种通过自动映射到底层物理资源而提供丰富的 "虚拟 "资源的机制。

该提案指出,使用虚拟线程不需要学习新的编程模型。使用Java编写并发应用程序的开发者已经知道这个模型。然而,开发人员需要改变由于线程的高成本而产生的旧习惯,特别是使用线程池,这些线程池只有在它们所汇集的资源稀缺或创建成本高昂时才有用。

虚拟线程是由JDK实现的java.lang.Thread的实例,它允许许多活动实例在同一进程中共存。虚拟线程的语义与平台线程相同,只是它们属于单一的ThreadGroup,不能被枚举。

 

参考资料:

1. 进程、线程和协程的区别

2. 编程宝库

posted on   编程宝库  阅读(892)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示