当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-ReentrantLock怎么实现公平锁的?

金三银四精选java面试题-ReentrantLock怎么实现公平锁的?

来源:图灵教育
时间:2024-01-02 13:12:40
 

ReentrantLock怎么实现公平锁的?

ReentrantLock可以通过构造函数的参数来控制锁的公平性,如果传入 true,就表示该锁是公平的;如果传入 false,就表示该锁是不公平的。

new ReentrantLock()构造函数默认创建的是非公平锁 NonfairSync

同时也可以在创建锁构造函数中传入具体参数创建公平锁 FairSync

FairSync、NonfairSync 代表公平锁和非公平锁,两者都是 ReentrantLock 静态内部类,只不过实现不同锁语义。

非公平锁和公平锁的区别:

  • 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。
  • 非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。