虚拟线程在 2023 年 9 月发布的 JDK 21 中正式成为一项稳定功能。该功能在 Java 生态系统中反响极佳,但仍存在一些痛点。Oracle 日前在 Inside Java 网站上详细介绍了虚拟线程的“Pinning”问题。
最常见的两种情况是:(a) 虚拟线程在 synchronized method 中驻留(如执行 socket I/O);(b) 虚拟线程阻塞进入 synchronized method,因为对象的相关监视器被另一个线程持有。
在这两种情况下,载体或本地线程都不会被释放去做其他工作。因此可能会影响性能和可扩展性,并可能在某些情况下导致饥饿和死锁。官方最近发布的一个Virtual Threads Next Steps 视频中则更详细地解释了其中的原因,并讨论了一些潜在的解决方案。
项目团队正在努力解决这些问题。Java Project Loom 的新早期访问版本引入了对对象监视器实现的更改,但不适用这两种常见情况。因此 Loom 团队正在寻求用户的帮助,以测试这些更新的对象监控器在使用虚拟线程的代码和大量同步的库中的可靠性和性能。可通过 Loom 邮件列表 报告或反馈问题。