同步块固定虚拟线程

4
我是一个热衷者,对虚拟线程很感兴趣。文档中提到,将线程固定在同步块中是其中一个条件,并且在这些情况下使用信号量。这里是关于JEP的文档链接:https://openjdk.org/jeps/444 有两种情况下,虚拟线程无法在阻塞操作期间解除挂载,因为它被固定在其载体上: 当它执行同步块或方法中的代码时, 或者当它执行本地方法或外部函数时。
这是因为同步块的实现是自旋锁,线程不会停止执行指令,而信号量会在几次尝试后让出执行权。

3
请编辑您的问题,添加一个链接到您所参考的文档。 - Andy Turner
3
请编辑您的问题,添加一个链接到您所参考的文档。 - undefined
请明确您的具体问题或提供额外的细节,以准确突出您所需要的内容。目前的描述方式让人难以确定您的具体需求。 - Community
请澄清您的具体问题或提供额外细节,以凸显您需要的内容。目前的描述让人很难准确理解您的需求。 - undefined
2
不,这只是在JVM中实现了同步,而信号量是在Java中实现的(它会使用虚拟线程并进行让步,而不是阻塞)。 - undefined
1
不,这只是在JVM中实现了同步,而信号量是在Java中实现的(它会使用虚拟线程并进行让步,而不是阻塞)。 - Johannes Kuhn
1个回答

5

JEP 425 在我看来,对你提出的问题提供了更详细的技术信息。它提到了 java.util.concurrent.locks.ReentrantLock。Java Concurrency 中还存在一个同步原语 Semaphore,它使用与 ReentrantLock 相同的 AbstractQueuedSynchronizer(也称为 AQS),因此在概念上是相同的,但是 ReentrantLock 的语义与 synchronized 块非常相似,建议将其替换。但这只是一个技术备注。

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

要理解两者之间的区别,我建议学习更多关于 CAS 的知识,或者尝试使用 Java 的 Atomic* 方法 compareAndSet 进行实验。

作为一个附注,ReentrantLock,AQS和其他一些同步原语仍然可能会阻塞线程(实际上,一般来说这是必要的),这是通过调用LockSupport.park方法来实现的。在底层,LockSupport.park也调用了本地方法,但出于某种原因,这对虚拟线程不是(或者更少是)问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接