登录
首页 >  文章 >  java教程

公平锁与非公平锁区别全解析

时间:2026-02-16 13:57:41 206浏览 收藏

公平锁与非公平锁的本质区别在于线程获取锁是否严格遵循等待时间顺序:公平锁(通过`new ReentrantLock(true)`创建)坚持FIFO原则,杜绝线程饥饿但性能较低;非公平锁(默认方式,`new ReentrantLock()`)允许后到线程通过CAS直接抢占锁,显著提升吞吐量和响应速度,却可能引发饥饿问题——Java内置的`synchronized`也采用非公平策略,正因其高效性而被广泛推荐;究竟选谁?关键不在“对错”,而在于你的场景更看重绝对公平,还是更高性能与更低延迟。

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

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

公平锁(Fair Lock)

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

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

非公平锁(Nonfair Lock)

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

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

关键差异对比

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

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

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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