非公平锁如何比公平锁有更好的性能呢?
How does unfair lock have better performance than fair lock?
接口 Lock 有一个有用的布尔公平参数来保证 fairness in locking - 等待锁时间最长的线程,最先获得锁。我想我想在任何地方都使用它,因为它可以防止 饥饿。好吧,在我读到它会降低我们的性能之前。
我找不到这个问题的答案,所以我希望有人能解决这个问题。意思是,采用“尊重”公平 的线程和不接受的线程有什么区别?它们不是都存储在其他等待线程所在的一些“普通”队列中吗?
首先,fairness
不是 interface Lock
,而是 ReentrantLock
。
发出Lock::lock
的线程可能根本不会被放入队列,无论是在fair
还是unfair
模式下。
unfair
模式稍微容易理解。在这种模式下,请求锁的线程(通过调用 Lock::lock
)会尝试立即获取锁而不排队。如果成功 - 完成。它没有放入任何队列,因为它可以获得锁。请注意,这并不关心队列中是否已经有等待线程,因此它是“不公平的”(对其他已经等待的线程)。如果它无法获得锁(意味着其他人拥有它),它就会被放入队列中。
另一方面,在 fair
模式下,调用 lock
的线程首先必须检查是否已经有线程在等待这个锁。如果没有这样的线程并且它可以拿锁:没有入队并拿锁。如果不能 - 它被排队。
最后一点是,在both公平和非公平模式下,线程都放在同一个队列中;即:fair/unfair
与队列的内部表示无关。
当锁被释放时,当有多个线程在等待它时,等待最长的线程是最有可能找到该内存页的线程它正在“睡觉”时被换掉了。休眠时间最少的线程最有可能“准备就绪”。
向@xingbin 道歉,如果这就是你想说的。
接口 Lock 有一个有用的布尔公平参数来保证 fairness in locking - 等待锁时间最长的线程,最先获得锁。我想我想在任何地方都使用它,因为它可以防止 饥饿。好吧,在我读到它会降低我们的性能之前。
我找不到这个问题的答案,所以我希望有人能解决这个问题。意思是,采用“尊重”公平 的线程和不接受的线程有什么区别?它们不是都存储在其他等待线程所在的一些“普通”队列中吗?
首先,fairness
不是 interface Lock
,而是 ReentrantLock
。
发出Lock::lock
的线程可能根本不会被放入队列,无论是在fair
还是unfair
模式下。
unfair
模式稍微容易理解。在这种模式下,请求锁的线程(通过调用 Lock::lock
)会尝试立即获取锁而不排队。如果成功 - 完成。它没有放入任何队列,因为它可以获得锁。请注意,这并不关心队列中是否已经有等待线程,因此它是“不公平的”(对其他已经等待的线程)。如果它无法获得锁(意味着其他人拥有它),它就会被放入队列中。
另一方面,在 fair
模式下,调用 lock
的线程首先必须检查是否已经有线程在等待这个锁。如果没有这样的线程并且它可以拿锁:没有入队并拿锁。如果不能 - 它被排队。
最后一点是,在both公平和非公平模式下,线程都放在同一个队列中;即:fair/unfair
与队列的内部表示无关。
当锁被释放时,当有多个线程在等待它时,等待最长的线程是最有可能找到该内存页的线程它正在“睡觉”时被换掉了。休眠时间最少的线程最有可能“准备就绪”。
向@xingbin 道歉,如果这就是你想说的。