接口锁有一个有用的布尔公平性参数来保证锁中的公平性—等待锁最长的线程首先获得锁。我想我想在任何地方都用它来防止饥饿。好吧,在我读到它会影响我们的表现之前。我找不到这个问题的答案,所以我希望有人能澄清这个问题。意思是,采用“尊重”公平的线程和不尊重公平的线程有什么区别?它们不是都存储在其他等待线程所在的“普通”队列中吗?
pzfprimi1#
首先它不是 interface Lock 有那个吗 fairness ,但它是 ReentrantLock .“普通”队列?像先进先出/后进先出(这已经不是“普通的”,因为它维护秩序)。所以我非常怀疑这是一个队列,它必须是一个允许随机访问的数据结构,首先(可能是一个队列,但允许随机访问)。争用下+ fair mode ,当某个线程要获取锁时,它必须首先:看看有没有人在等那把锁转到队列(必须按等待时间排序)等待轮到它执行低于 unfair mode ,线程所要做的就是尝试 CAS (比较和交换)试图获得锁。所有线程都会同时执行此操作:谁赢了,谁就可以完成工作。所以在不公平的情况下要做的工作要少得多。
interface Lock
fairness
ReentrantLock
fair mode
unfair mode
CAS
hec6srdp2#
当一个锁被释放,并且有多个线程在等待它时,等待时间最长的线程最有可能发现它想要的内存页在“休眠”时被交换掉。休眠时间最少的线程最有可能“准备就绪”如果这是你想说的,那就向@xingbin道歉。
2条答案
按热度按时间pzfprimi1#
首先它不是
interface Lock
有那个吗fairness
,但它是ReentrantLock
.“普通”队列?像先进先出/后进先出(这已经不是“普通的”,因为它维护秩序)。所以我非常怀疑这是一个队列,它必须是一个允许随机访问的数据结构,首先(可能是一个队列,但允许随机访问)。
争用下+
fair mode
,当某个线程要获取锁时,它必须首先:看看有没有人在等那把锁
转到队列(必须按等待时间排序)
等待轮到它执行
低于
unfair mode
,线程所要做的就是尝试CAS
(比较和交换)试图获得锁。所有线程都会同时执行此操作:谁赢了,谁就可以完成工作。所以在不公平的情况下要做的工作要少得多。hec6srdp2#
当一个锁被释放,并且有多个线程在等待它时,等待时间最长的线程最有可能发现它想要的内存页在“休眠”时被交换掉。休眠时间最少的线程最有可能“准备就绪”
如果这是你想说的,那就向@xingbin道歉。