虚拟线程什么时候仍然会卡住载体线程?这篇限制载体线程数,用同样的阻塞任务对比无锁、ReentrantLock 和 synchronized,并在 JDK 21 与 27 上各跑一遍(虚拟线程的基本行为见上一篇)。
[没有锁] plain:10 个虚拟线程各阻塞 500 ms,总耗时 520 ms [ReentrantLock 里] lock:10 个虚拟线程各阻塞 500 ms,总耗时 519 ms [synchronized 里] sync:10 个虚拟线程各阻塞 500 ms,总耗时 2548 ms
[没有锁] plain:10 个虚拟线程各阻塞 500 ms,总耗时 519 ms [ReentrantLock 里] lock:10 个虚拟线程各阻塞 500 ms,总耗时 518 ms [synchronized 里] sync:10 个虚拟线程各阻塞 500 ms,总耗时 519 ms
VirtualThread[#N]/runnable@ForkJoinPool-1-worker-K reason:MONITOR
java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:199)
java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:393)
java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:635)
java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:807)
java.base/java.lang.Thread.sleep(Thread.java:507)
Main.lambda$main$0(Main.java:1) <== monitors:1
java.base/java.lang.VirtualThread.run(VirtualThread.java:329)
(JDK 27 同一程序、同一参数的输出:) ''