同步块固定虚拟线程

Вас*_*гов 4 java project-loom

我是一名爱好者,对虚拟线程感到好奇。在文档中,它说固定线程的条件之一是在同步块中,并且在这些情况下使用信号量。以下是 JEP 的文档https://openjdk.org/jeps/444

在两种情况下,虚拟线程在阻塞操作期间无法卸载,因为它被固定到其载体:当它执行同步块或方法内的代码时,或者当它执行本机方法或外部函数时。

这是因为同步块的实现是自旋锁并且线程不会停止执行指令,而信号量会在几次尝试后屈服?

igo*_*.zh 5

我认为,JEP 425 提供了有关您提出的问题的更详细的技术信息它提到java.util.concurrent.locks.ReentrantLock. Java并发中也存在同步原语Semaphore,它使用相同的AbstractQueuedSynchronizerAQS ReentrantLock,因此概念上是相同的,但语义ReentrantLocksynchronized块的语义非常相似,建议替换。但这是技术性评论。

关键区别在于ReentrantLock,AQS、直接Unsafe/VarHandle和类似的同步原语使用非阻塞 CAS 技术,同时synchronized阻塞线程,至少在争用情况下是如此。

要了解两者之间的区别,我建议了解有关CAS 的更多信息和/或尝试 JavaAtomic*方法compareAndSet

顺便说明一下,ReentrantLockAQS 和其他一些同步原语仍然可能会阻塞线程(事实上,一般来说,这是必要的),它是通过调用LockSupport.park方法来完成的。在幕后,LockSupport.park还调用本机方法,但由于某种原因,这对于虚拟线程来说不是(或较小的?)问题。