Java虚拟线程不能使用同步synchronized锁!
💡
原文中文,约2900字,阅读约需7分钟。
📝
内容提要
Project Loom是Java运行时的一个稳定功能,旨在将异步编程的性能优势与同步编程的简单性结合起来。它使用虚拟线程和载体线程来提高性能,并改造了一些并发原语以适应虚拟线程。然而,并非所有阻塞API都能适应虚拟线程,需要采取解决方案来避免线程钉住现象。统一接口的抽象是否是一个好主意取决于情况。运行时需要提供适当的配置来确定I/O操作的执行方式。
🎯
关键要点
-
Project Loom是Java运行时的一个稳定功能,旨在结合异步编程的性能优势与同步编程的简单性。
-
Loom引入了虚拟线程和载体线程,以提高性能并处理阻塞操作。
-
阻塞操作是指程序线程等待外部条件而不消耗CPU资源。
-
平台线程是内核线程,重量级且创建和切换成本高昂,而虚拟线程是轻量级且创建成本低廉。
-
Loom通过复用虚拟线程在少量平台线程上运行,提高了系统的并发能力。
-
线程钉住问题是指某些Java结构(如synchronized)会导致虚拟线程固定在载体线程上,影响性能。
-
使用锁而非synchronized可以避免线程钉住问题,提高性能。
-
Loom对阻塞操作进行了改造,使其能够更好地支持虚拟线程,但并非所有阻塞API都适应虚拟线程。
-
一些操作(如文件I/O)在内核级别本身就是阻塞的,Loom无法以非阻塞方式实现。
-
统一接口的抽象是否是一个好主意取决于具体情况,可能会产生误导。
-
Loom推动了JVM的发展,简化了编程模型,但不能完全消除内核线程阻塞的问题。
➡️