在Java里公平锁和非公平锁有什么区别_Java锁策略说明

发布时间 - 2026-02-01 00:00:00    点击率:
公平锁与非公平锁的核心区别在于锁空闲时是否允许插队:公平锁严格按等待队列顺序获取,非公平锁允许直接抢占;ReentrantLock默认非公平(new ReentrantLock()等价于new ReentrantLock(false)),需显式传true启用公平模式;非公平锁性能通常高10%–30%,公平锁仅在强顺序、已现饥饿或低竞争场景适用。

公平锁和非公平锁的核心区别在「抢锁时机」

不是“谁先启动线程谁先拿到锁”这种表面顺序,而是看线程在锁空闲的瞬间是否允许“插队”。
公平锁会严格检查:当前有没有其他线程在排队?自己是不是队头?只有满足才拿锁。
非公平锁则不管排队情况,只要锁一空闲,就立刻 compareAndSetState(0, 1) 尝试抢占——哪怕队列里已有 5 个线程在等。

ReentrantLock 构造参数决定行为,但默认是非公平的

很多人以为 new ReentrantLock() 是“中性”的,其实它等价于 new ReentrantLock(false),即明确启用非公平模式。
要切到公平模式,必须显式传 truenew ReentrantLock(true)
这个布尔值只影响锁的同步器实现类(FairSync vs NonfairSync),一旦实例化无法更改。

性能差异真实存在,尤其在高并发争抢场景

非公平锁吞吐量通常高出 10%–30%,因为省去了每次抢锁前对等待队列的检查(hasQueuedPredecessors());
公平锁虽然避免了饥饿,但每个释放锁的操作都要唤醒队头线程,且唤醒后还需重新调

度,带来额外上下文切换开销。
常见误判:

  • 认为“公平=更安全”——其实数据一致性不依赖公平性,而依赖锁的互斥语义
  • 在日志打印、计数器等低竞争场景强行用公平锁——毫无收益,纯增开销
  • synchronized 当成可配置的公平锁——它底层是 JVM 实现的非公平锁,无法改为公平

什么时候该选公平锁?别靠感觉,看这三点

公平锁不是“更高级”的选项,而是特定约束下的妥协方案:

  • 业务逻辑要求强顺序性,比如任务调度器必须按提交时间执行,不能让后提交的高优先级任务反复插队
  • 已观察到明显饥饿现象:某个线程长期 WAITINGAbstractQueuedSynchronizer$ConditionObject.await() 上,且堆栈始终卡在锁获取路径
  • 系统负载低、锁竞争不激烈(如配置加载、初始化阶段),此时公平性开销占比小,可接受
否则,默认用非公平锁更稳妥——这也是 JDK 选择它作为 ReentrantLocksynchronized 默认策略的根本原因。


# java  #   # ai  # 区别  # red  # jvm  #   # 线程  # 并发  # 都要  # 什么时候  # 已有  # 很多人  # 闲时  # 能让  # 高出  # 还需  # 这三  # 根本原因 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: phpredis提高消息队列的实时性方法(推荐)  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何注册花生壳免费域名并搭建个人网站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  js实现点击每个li节点,都弹出其文本值及修改  Android滚轮选择时间控件使用详解  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  微信小程序制作网站有哪些,微信小程序需要做网站吗?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何在建站之星绑定自定义域名?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  青岛网站建设如何选择本地服务器?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  智能起名网站制作软件有哪些,制作logo的软件?  html如何与html链接_实现多个HTML页面互相链接【互相】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  怎么用AI帮你为初创公司进行市场定位分析?  JavaScript模板引擎Template.js使用详解  Laravel中的Facade(门面)到底是什么原理  Swift中switch语句区间和元组模式匹配  JS弹性运动实现方法分析  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel如何实现模型的全局作用域?(Global Scope示例)  黑客如何通过漏洞一步步攻陷网站服务器?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  详解Android中Activity的四大启动模式实验简述  Thinkphp 中 distinct 的用法解析  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  音响网站制作视频教程,隆霸音响官方网站?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何快速查询网站的真实建站时间?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  高端建站如何打造兼具美学与转化的品牌官网?  网站制作免费,什么网站能看正片电影?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何确保西部建站助手FTP传输的安全性?  如何快速搭建二级域名独立网站?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel怎么使用artisan命令缓存配置和视图  如何撰写建站申请书?关键要点有哪些?  如何在阿里云高效完成企业建站全流程?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】