当前位置: 首页 > news >正文

ReentrantLock 公平锁 非公平锁底层实现原理

目录一、基础铺垫ReentrantLock 的核心结构二、非公平锁NonfairSync底层实现1. 加锁核心流程2. 非公平锁关键特性三、公平锁FairSync底层实现1. 加锁核心流程2. 公平锁关键特性四、释放锁逻辑公平 / 非公平完全一致五、核心区别总结底层实现总结ReentrantLock是 Java 中基于 AQSAbstractQueuedSynchronizer抽象队列同步器实现的可重入锁公平锁和非公平锁的核心区别线程获取锁的顺序是否严格遵循等待队列的 FIFO先进先出规则。先明确核心结论非公平锁新线程来抢锁时先直接尝试插队抢占锁抢不到再进入等待队列排队公平锁绝对禁止插队新线程来抢锁时先检查队列里有没有其他线程在等待有就直接排队不尝试抢占。一、基础铺垫ReentrantLock 的核心结构ReentrantLock内部定义了Sync抽象类继承 AQS公平锁FairSync、非公平锁NonfairSync都继承自 SyncAQS 核心组件stateint 变量0无锁0持有锁重入次数exclusiveOwnerThread记录当前持有锁的线程CLH 等待队列双向链表存储抢不到锁的等待线程。可重入特性同一个线程多次获取锁时state累加释放锁时递减直到state0才真正释放锁。二、非公平锁NonfairSync底层实现核心设计先插队失败再排队追求更高吞吐量默认锁。1. 加锁核心流程// 非公平锁lock()方法 final void lock() { // 第一步直接插队CAS尝试将state从0改为1抢占锁 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); // 抢占成功设置持有线程 else acquire(1); // 抢占失败走标准AQS获取锁逻辑 } // AQS的acquire方法非公平/公平锁通用骨架 public final void acquire(int arg) { // 1. 再次尝试获取锁 2. 获取失败则入队等待 if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } // 非公平锁的tryAcquire重写AQS方法 protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } // 非公平锁核心获取逻辑 final boolean nonfairTryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 锁空闲 // 再次插队CAS抢锁不检查队列 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } // 可重入当前线程已持有锁state1 else if (current getExclusiveOwnerThread()) { int nextc c acquires; setState(nextc); return true; } return false; // 抢锁失败 }2. 非公平锁关键特性两次插队机会第一次lock()直接 CAS 抢锁第二次tryAcquire()发现锁空闲再次 CAS 抢锁不检查等待队列只要锁空闲新线程可以直接抢走不管队列里有没有等待很久的线程优点减少线程上下文切换吞吐量高缺点可能导致队列线程 饥饿长时间抢不到锁。三、公平锁FairSync底层实现核心设计不插队先检查队列排队获取锁保证严格的先来先服务。1. 加锁核心流程// 公平锁lock()方法直接走acquire没有插队CAS final void lock() { acquire(1); } // 公平锁的tryAcquire重写AQS方法 protected final boolean tryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 核心区别先检查队列hasQueuedPredecessors()队列有等待线程 if (!hasQueuedPredecessors() // 队列空才允许抢锁 compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } // 可重入逻辑和非公平锁完全一致 else if (current getExclusiveOwnerThread()) { int nextc c acquires; setState(nextc); return true; } return false; }2. 公平锁关键特性禁止任何插队lock()直接走标准流程没有 CAS 抢占强制检查队列hasQueuedPredecessors()是核心判断如果队列里有其他线程在等待 → 新线程直接入队不抢锁只有队列为空 / 自己是队首线程 → 才允许抢锁优点无线程饥饿严格公平缺点频繁上下文切换吞吐量低于非公平锁。四、释放锁逻辑公平 / 非公平完全一致释放锁没有公平性区别核心都是state递减state0时释放持有线程唤醒队列中的下一个等待线程。public void unlock() { sync.release(1); } public final boolean release(int arg) { if (tryRelease(arg)) { Node h head; if (h ! null h.waitStatus ! 0) unparkSuccessor(h); // 唤醒队列下一个线程 return true; } return false; } // 释放锁state-1为0时释放锁 protected final boolean tryRelease(int releases) { int c getState() - releases; if (Thread.currentThread() ! getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free false; if (c 0) { free true; setExclusiveOwnerThread(null); } setState(c); return free; }五、核心区别总结底层实现对比维度非公平锁NonfairSync公平锁FairSync抢锁入口lock()先 CAS 插队抢锁直接走acquire()不插队锁空闲时不检查队列直接 CAS 抢锁必须先检查hasQueuedPredecessors()等待队列新线程可能跳过队列严格遵守 FIFO 队列顺序线程饥饿可能出现不会出现吞吐量高低底层差异无队列检查多了hasQueuedPredecessors()判断总结底层基石公平 / 非公平锁都基于AQS实现核心差异在tryAcquire()抢锁逻辑非公平锁插队优先两次 CAS 抢锁不检查等待队列吞吐量更高公平锁排队优先强制检查队列绝对禁止插队无饥饿但性能更低通用特性可重入、锁释放逻辑、CLH 等待队列、AQS 的state状态管理完全一致。
http://www.gsyq.cn/news/1403679.html

相关文章:

  • 基于fastAPI--- 对接oss
  • 2026年在赣州去哪买高性价比家具?这些靠谱渠道推荐别错过
  • 基于短时相关与FFT的多星座GNSS信号高速捕获VLSI架构设计
  • AutoGen
  • SRAM存内计算在Massive MIMO信号检测中的高能效架构与设计权衡
  • 终极指南:如何选择EmulatorJS版本?稳定版、最新版、夜间版全面解析
  • 内容创作者如何借助Taotoken多模型能力高效生成不同风格文案
  • 鸣潮智能自动化助手:3步实现后台挂机,解放双手提升300%游戏效率
  • 对比自行维护多个API密钥Taotoken的集中管理带来了哪些便利
  • 「研究分析·适配解析·优化方案·避坑指南·体系总结」基层工作宣传稿发稿渠道内容审核、合规风控、媒体适配与收录优化、长效留存全维度实操指引
  • HGP-MAMBA:结合组织学和生成的蛋白质特征进行基于MAMBA的多模式生存风险预测
  • 成本最优解:基于RAG+LoRA的实体企业本地化AI营销助手构建实践
  • Windows下载管理优化:基于注册表权限的IDM试用期管理方案
  • UFS 2.2 协议架构深度解析:从分层模型到系统启动
  • DyberPet桌面宠物框架:基于PySide6的虚拟伙伴开发全攻略
  • 对比直接使用厂商API体验Taotoken在容灾与路由上的稳定性
  • 清华大学thuthesis LaTeX模板:在Overleaf上快速完成学位论文的终极指南
  • SingleFile:一键保存完整网页的终极解决方案,彻底告别碎片化保存烦恼
  • 终极图片对比工具:3分钟掌握PicQuickCompare快速检测图片差异的完整指南
  • AI 搜索公司 Perplexity 开源 Bumblebee,为软件供应链投毒防御添新利器
  • Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
  • 大同全域黄金回收上门服务实测指南:六家正规门店逐个探,2026年5月真实报价公开,乡镇也能免费上门 - 润富黄金珠宝行
  • 如何在Typora中实现智能代码块管理:5个关键技术突破
  • Midscene.js:让AI成为你的UI操作员,告别繁琐的自动化脚本编写
  • LAMP网站架构日常运维之服务启停【20260527】002篇
  • Django学习教程(一)Django介绍和环境准备
  • 20-系统快照详情与动态流:为什么快照不该只是一次静态保存
  • 基于SDR的5G智能手机八天线MIMO实时测试平台构建与验证
  • 古典乐理教师集体沉默的真相(内部培训PPT流出):ChatGPT已能完成本科《和声学II》全部作业,但仅7.3%用户掌握“约束型提问法”
  • Simulink仿真图导出与Visio精修实战:毕业设计图表优化指南