ReentrantLock 怎么实现公平锁的?
ReentrantLock 的默认构造方法创建的是非公平锁 NonfairSync。
public ReentrantLock() {
sync = new NonfairSync();
}
可以通过有参构造方法传递 true 参数来创建公平锁 FairSync。
ReentrantLock lock = new ReentrantLock(true);
--- ReentrantLock
// true 代表公平锁,false 代表非公平锁
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
FairSync、NonfairSync 都是 ReentrantLock 的内部类,分别实现了公平锁和非公平锁的逻辑。
非公平锁和公平锁有什么不同?
①、公平锁意味着在多个线程竞争锁时,获取锁的顺序与线程请求锁的顺序相同,即先来先服务(FIFO)。
虽然能保证锁的顺序,但实现起来比较复杂,因为需要额外维护一个有序队列。

②、非公平锁不保证线程获取锁的顺序,当锁被释放时,任何请求锁的线程都有机会获取锁,而不是按照请求的顺序。
怎么实现一个非公平锁呢?
要实现一个非公平锁,只需要在创建 ReentrantLock 实例时,不传递任何参数或者传递 false 给它的构造方法就好了。
THE END
暂无评论内容