对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。
同步锁按照线程申请锁的顺序,非同步则不保证
公平锁
概念
加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得。
实现方式
在java中,通过new ReentrantLock(true)来实现;
优缺点
公平锁的好处是等待锁的线程不会饿死,但是整体效率相对低一些;
非公平锁
概念
线程不是按先后顺序获得锁,效率比公平锁效率高
加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待。
会造成优先级反转或者饥饿现象。
实现方式
通过new ReentrantLock(false)或者默认构造函数new ReentrantLock()实现。
优缺点
非公平锁的优点在于吞吐量比公平锁大。
非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死或者说很早就在等待锁,但要等很久才会获得锁。