登录
首页 >  文章 >  java教程

公平锁与非公平锁区别是什么

时间:2026-02-22 10:45:41 441浏览 收藏

公平锁与非公平锁的核心差异在于线程获取锁的顺序是否严格遵循等待时间先后:公平锁(通过`new ReentrantLock(true)`创建)坚持FIFO原则,杜绝线程饥饿但性能较低;非公平锁(默认方式,`synchronized`也属此类)允许后到线程通过CAS直接抢占锁,显著提升吞吐量和响应速度,却可能引发个别线程长期等待。二者本质是公平性与高性能之间的经典权衡——多数高并发场景推荐非公平锁,而对调度公正性有硬性要求的系统才需启用公平锁。

Java中公平锁与非公平锁区别

公平锁与非公平锁的核心区别在于线程获取锁的顺序是否遵循等待时间的先后。在Java中,这种机制主要体现在ReentrantLock的实现上。

公平锁(Fair Lock)

公平锁会保证线程按照申请锁的时间顺序获得锁,即先等待的线程优先获取锁。

  • 通过new ReentrantLock(true)创建。
  • 每次尝试获取锁时,都会检查是否有其他线程在等待,如果有,则当前线程排队。
  • 避免了线程“饥饿”现象,所有线程都有机会执行。
  • 由于需要查询等待队列,性能相对较低,吞吐量较小。

非公平锁(Nonfair Lock)

非公平锁允许多个线程抢占锁,不保证等待顺序,后请求的线程可能比前面的线程更早获得锁。

  • 默认方式,new ReentrantLock()new ReentrantLock(false)创建。
  • 线程在获取锁时会直接尝试CAS操作,成功则占有锁,无需查看队列中是否有等待者。
  • 可能导致某些线程长时间无法获取锁(饥饿),但整体效率更高。
  • 减少了线程切换和队列检查开销,吞吐量更大。

关键差异对比

调度策略: 公平锁按FIFO顺序分配;非公平锁允许插队。
性能表现: 非公平锁因减少竞争判断,通常更快。
使用场景: 对响应时间敏感、高并发场景适合非公平锁;对线程执行公平性要求高的场景用公平锁。
synchronized: Java内置锁属于非公平锁。

基本上就这些。选择哪种锁取决于应用对公平性和性能的权衡。非公平锁是多数情况下的合理默认选择。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>