接口锁有一个有用的布尔公平性参数来保证锁的公平性-线程等待锁的时间最长,获得锁的第一个。我想我想在任何地方使用它,因为它可以防止饥饿。嗯,在我读到它会让我们付出更多的代价之前。
我找不到这个问题的答案,所以我希望有人能澄清这一点。也就是说,接受“尊重”公平的线程和不“尊重”公平的线程之间有什么区别?它们不是都存储在其他等待线程所在的“普通”队列中吗?
发布于 2020-11-25 03:26:50
首先,不是interface Lock有fairness,而是ReentrantLock。
发出Lock::lock的线程可能根本不会放在队列中,无论是在fair模式还是unfair模式下。
unfair模式稍微容易理解。在这种模式下,请求锁的线程(通过调用Lock::lock)试图立即获得锁,而不需要排队。如果成功的话-完成了。它不会被放入任何队列,因为它可以获得锁。请注意,这并不关心队列中是否已经有等待线程,因此这是“不公平的”(对其他已经在等待的线程)。如果它无法获得锁(意味着其他人拥有它),则将其放到队列中。
另一方面,在fair模式下,调用lock的线程必须首先检查是否已经有线程等待此锁。如果没有这样的线程,并且它可以接受锁:没有队列并接受锁。如果它不能-它是排队。
最后一点是,在公平和不公平的模式下,线程被放在同一个队列上;也就是说:fair/unfair不是关于队列的内部表示。
发布于 2020-11-25 14:37:01
当一个锁被释放时,当多个线程在等待它时,等待时间最长的线程最有可能发现它想要的内存页在“休眠”时被交换掉了。睡眠时间最少的线程最有可能是“准备就绪”。
如果这是你想说的话,请向@xingbin道歉。
https://stackoverflow.com/questions/64997466
复制相似问题