java 同步块固定虚拟线程

e37o9pze  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(110)

我是一个爱好者,我想知道虚拟线程。在文档中,它说固定线程的条件之一是在同步块中,在这种情况下使用信号量。以下是JEP https://openjdk.org/jeps/444的文档
在两种情况下,由于虚拟线程被固定到其载体,因此在阻塞操作期间无法卸载虚拟线程:当它执行同步块或方法内的代码时,或者当它执行本机方法或外部函数时。
这是因为同步块的实现是一个自旋锁,线程不会停止执行指令,而信号量在几次尝试后就会退出吗?

qxsslcnc

qxsslcnc1#

在我看来,JEP 425提供了关于您提出的问题的更详细的技术信息。它提到了java.util.concurrent.locks.ReentrantLock。同步原语Semaphore也存在于Java Concurrency中,它使用相同的AbstractQueuedSynchronizer a.k. a。ReentrantLocksynchronized块的语义非常相似,建议将其替换。但这是一个技术性的评论。
关键的区别是ReentrantLock、AQS、直接Unsafe/VarHandle和类似的同步原语使用非阻塞CAS技术,而synchronized阻塞线程,至少在争用的情况下是这样。
要理解两者之间的区别,我建议您学习更多关于CAS的知识和/或尝试使用Java Atomic*方法compareAndSet
顺便说一下,ReentrantLock,AQS和其他一些同步原语仍然可能会阻塞线程(实际上,一般来说,这是必要的),这是通过调用LockSupport.park方法来完成的。在后台,LockSupport.park还调用了一个本机方法,但由于某种原因,这不是(或更少?))问题。

相关问题