【发布时间】:2021-04-18 08:21:11
【问题描述】:
我对@987654322@ 的Condition 感到困惑。这是文档:
等待线程按 FIFO 顺序发出信号。
等待返回的线程重新获取锁的顺序 方法与最初获取锁的线程相同,即 在默认情况下未指定,但对于公平锁有利于那些 等待时间最长的线程。
根据最新的子弹,公平性带来了一个明确的信号锁定重新获取顺序。
但第一个项目符号的含义是什么等待线程以 FIFO 顺序发出信号?我认为在这种情况下,信号仅意味着“信号”,这意味着它按照 FIFO 顺序“解除”线程,但唤醒时的实际重新获取顺序由公平性决定。
There are pretty large amount of staff 与 cxq 绑定,并且 HotSpot 内部的等待队列我不太了解(不幸的是)。
问题:
等待线程按 FIFO 顺序发出信号是否意味着等待线程按照它们被停放的顺序解除停放(即使锁本身是不公平的)?
由于一般情况下存在 unpark-reaquire 竞赛,公平性是否提供了必要的重新获取排序保证?
【问题讨论】:
-
至于第一个问题,FIFO -> 先进先出,所以信令不是按照相反的顺序进行的,而是按照相同的顺序进行的
-
@areus 当然,谢谢。
-
您链接的
mutex.cpp与Java 类ReentrantLock无关。该本机代码用于实现synchronized,它根本没有公平模式。 -
@Holger 它委托给 Unsafe.park,而 Unsafe.park 本身又委托给
static ParkCommon -
但是
park或unpark的实现与ReentrantLock内部的队列实现完全无关。AbstractQueuedSynchronizer.
标签: java multithreading jvm hotspot