一、虚拟线程:Java并发的革新
Java 21于2023年9月发布,虚拟线程(Virtual Threads)是其中最引人注目的特性。传统Java线程与操作系统线程1:1绑定,创建成本高、切换开销大,限制了一个JVM能同时处理的请求数量。虚拟线程通过M:N调度——大量虚拟线程映射到少量平台线程——彻底改变了这一局面。
二、技术原理
虚拟线程基于Continuation(续延)实现。当虚拟线程执行阻塞操作(如I/O、sleep)时,它会被挂起(yield),底层的平台线程立即切换到其他虚拟线程继续执行。阻塞操作完成后,虚拟线程被恢复(resume)到可用平台线程。整个过程对开发者完全透明——代码依然是同步风格的!
三、与Go Goroutine对比
| 特性 | Java虚拟线程 | Go Goroutine |
|---|---|---|
| 创建成本 | 极低(纯Java对象) | 极低(2KB栈) |
| 调度模型 | M:N(虚拟线程→平台线程) | M:N(GMP调度器) |
| 阻塞语义 | 同步代码自动挂起 | 同步代码自动挂起 |
| 学习曲线 | 低(线程API不变) | 中(需理解Channel、select) |
四、最佳实践
虚拟线程最适用于I/O密集型高并发场景(Web服务、数据库操作、微服务调用)。不适用于CPU密集型计算——此时应使用并行Stream或ForkJoinPool。注意:避免synchronized块内长时间阻塞(会导致平台线程被固定)。
评论 (43)