在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),即明确启用非公平模式。
要切到公平模式,必须显式传 true:new ReentrantLock(true)。
这个布尔值只影响锁的同步器实现类(FairSync vs NonfairSync),一旦实例化无法更改。
性能差异真实存在,尤其在高并发争抢场景
非公平锁吞吐量通常高出 10%–30%,因为省去了每次抢锁前对等待队列的检查(hasQueuedPredecessors());
公平锁虽然避免了饥饿,但每个释放锁的操作都要唤醒队头线程,且唤醒后还需重新调

常见误判:
- 认为“公平=更安全”——其实数据一致性不依赖公平性,而依赖锁的互斥语义
- 在日志打印、计数器等低竞争场景强行用公平锁——毫无收益,纯增开销
- 把
synchronized当成可配置的公平锁——它底层是 JVM 实现的非公平锁,无法改为公平
什么时候该选公平锁?别靠感觉,看这三点
公平锁不是“更高级”的选项,而是特定约束下的妥协方案:
- 业务逻辑要求强顺序性,比如任务调度器必须按提交时间执行,不能让后提交的高优先级任务反复插队
- 已观察到明显饥饿现象:某个线程长期
WAITING在AbstractQueuedSynchronizer$ConditionObject.await()上,且堆栈始终卡在锁获取路径 - 系统负载低、锁竞争不激烈(如配置加载、初始化阶段),此时公平性开销占比小,可接受
ReentrantLock 和 synchronized 默认策略的根本原因。
# 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文件中的所有图片【几行代码即可实现】

