我是一个爱好者,我想知道虚拟线程。在文档中,它说固定线程的条件之一是在同步块中,在这种情况下使用信号量。以下是JEP https://openjdk.org/jeps/444的文档
在两种情况下,由于虚拟线程被固定到其载体,因此在阻塞操作期间无法卸载虚拟线程:当它执行同步块或方法内的代码时,或者当它执行本机方法或外部函数时。
这是因为同步块的实现是一个自旋锁,线程不会停止执行指令,而信号量在几次尝试后就会退出吗?
我是一个爱好者,我想知道虚拟线程。在文档中,它说固定线程的条件之一是在同步块中,在这种情况下使用信号量。以下是JEP https://openjdk.org/jeps/444的文档
在两种情况下,由于虚拟线程被固定到其载体,因此在阻塞操作期间无法卸载虚拟线程:当它执行同步块或方法内的代码时,或者当它执行本机方法或外部函数时。
这是因为同步块的实现是一个自旋锁,线程不会停止执行指令,而信号量在几次尝试后就会退出吗?
1条答案
按热度按时间qxsslcnc1#
在我看来,JEP 425提供了关于您提出的问题的更详细的技术信息。它提到了
java.util.concurrent.locks.ReentrantLock
。同步原语Semaphore
也存在于Java Concurrency中,它使用相同的AbstractQueuedSynchronizer
a.k. a。ReentrantLock
和synchronized
块的语义非常相似,建议将其替换。但这是一个技术性的评论。关键的区别是
ReentrantLock
、AQS、直接Unsafe
/VarHandle
和类似的同步原语使用非阻塞CAS技术,而synchronized
阻塞线程,至少在争用的情况下是这样。要理解两者之间的区别,我建议您学习更多关于CAS的知识和/或尝试使用Java
Atomic*
方法compareAndSet
。顺便说一下,
ReentrantLock
,AQS和其他一些同步原语仍然可能会阻塞线程(实际上,一般来说,这是必要的),这是通过调用LockSupport.park
方法来完成的。在后台,LockSupport.park
还调用了一个本机方法,但由于某种原因,这不是(或更少?))问题。