公平锁与非公平锁的区别
时间: 2023-02-21 16:14:27 浏览: 86
公平锁与非公平锁是指多线程访问共享资源时,锁的两种不同类型。
公平锁是指多个线程按照申请锁的顺序来获得锁,确保了每个线程都有机会获得锁,防止饥饿现象的发生。因此,公平锁的性能较差,但是保证了公平性。
非公平锁是指多个线程获取锁的顺序是不确定的,有可能导致某些线程一直无法获得锁。因此,非公平锁的性能较高,但是不保证公平性。
总的来说,公平锁与非公平锁在性能和公平性上存在一定的平衡,在使用时要根据实际需求选择合适的锁类型。
相关问题
ReentrantLock公平锁和非公平锁的区别
ReentrantLock是Java中的一个锁实现类,它提供了公平锁和非公平锁两种模式。它们的区别在于获取锁的顺序和公平性的处理方式。
1. 公平锁:
公平锁是指多个线程按照申请锁的顺序来获取锁,即先到先得的原则。在公平锁模式下,当一个线程释放锁后,等待时间最长的线程将获得锁的访问权。公平锁保证了锁的获取是按照线程的申请顺序进行的,避免了饥饿现象。
2. 非公平锁:
非公平锁是指多个线程获取锁的顺序是不确定的,是一种抢占式的获取方式。在非公平锁模式下,当一个线程释放锁后,任何一个等待锁的线程都有机会获取到锁,不管它是不是等待时间最长的线程。非公平锁允许新来的线程插队,可能会导致某些线程一直无法获取到锁,造成饥饿现象。
总结一下:
- 公平锁按照线程申请锁的顺序来获取锁,保证了锁的公平性。
- 非公平锁允许新来的线程插队获取锁,可能会导致某些线程一直无法获取到锁,造成饥饿现象。
juc的公平锁与非公平锁
JUC中的公平锁和非公平锁都是ReentrantLock类的实现。公平锁和非公平锁的区别在于获取锁的方式不同。
公平锁:线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的原则。当一个线程释放锁时,等待时间最长的线程将获得锁。
非公平锁:线程获取锁的顺序是随机的,不保证等待时间最长的线程能够优先获得锁。当一个线程释放锁时,任何一个等待锁的线程都有机会获得锁。
在实际应用中,如果对于线程获取锁的顺序有严格要求,可以使用公平锁;如果对于线程获取锁的顺序没有严格要求,可以使用非公平锁,因为非公平锁的吞吐量比公平锁高。
阅读全文