温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java多线程为何要公平锁

发布时间:2026-10-24 01:40:05 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 Java 多线程中,公平锁(Fair Lock)并不是“必须使用的锁”,而是一种权衡选择。是否使用公平锁,取决于你对公平性、吞吐量、响应性的要求。

下面从「为什么会有公平锁」「它解决什么问题」「代价是什么」三个角度说明。


一、为什么需要公平锁?

在 非公平锁(默认) 下:

  • 线程释放锁后
  • 刚来的线程可能直接抢到锁
  • 已经在等待队列里排队的线程反而可能一直拿不到

这会带来一个问题:线程饥饿(Starvation)

某些线程长期得不到执行机会

公平锁的作用

保证线程按照“请求锁的顺序”来获取锁

  • 先来先得
  • 避免某些线程被长期插队
  • 提高系统的“公平性”

二、公平锁解决了什么场景问题?

1️⃣ 避免线程饥饿(最重要)

例如:

  • 高并发读 / 写
  • 某些线程执行频率高
  • 某些线程执行频率低

非公平锁可能导致:

高频线程一直抢到锁,低频线程永远等不到

公平锁可以保证:

哪怕你慢,只要你先来,就先执行


2️⃣ 业务逻辑上要求顺序性

例如:

  • 消息处理
  • 订单处理
  • 日志写入

如果业务上要求:

谁先请求,谁先处理

那么用公平锁更自然。


3️⃣ 降低“惊群效应”带来的不确定性

非公平锁在高并发下:

  • 大量线程同时抢锁
  • 结果不可预测

公平锁:

  • 行为更可预期
  • 更适合调试和推理

三、公平锁的代价(为什么默认不用)

❌ 性能更低

公平锁必须:

  • 维护等待队列
  • 严格按顺序唤醒

导致:

  • 上下文切换更多
  • 吞吐量下降

❌ 吞吐量通常不如非公平锁

非公平锁允许:

刚释放锁的线程立刻再拿锁(热锁复用)

这在很多场景下性能更好。


四、Java 中的公平锁示例

ReentrantLock lock = new ReentrantLock(true); // true = 公平锁
  • true:公平锁
  • false(默认):非公平锁

五、什么时候该用公平锁?

✅ 适合用:

  • 线程饥饿明显
  • 业务强调顺序
  • 并发量不是特别高

❌ 不适合用:

  • 高吞吐、低延迟系统
  • 锁竞争激烈但不在乎顺序
  • 性能优先场景

六、一句话总结

公平锁是为了“公平”,不是为了提高性能。
它解决的是“谁能先拿到锁”的问题,代价是牺牲吞吐量。

如果你愿意,我也可以帮你:

  • 对比 synchronized 和 ReentrantLock
  • 分析你当前场景是否需要公平锁
  • 给出性能优化建议
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手