JDK Locks 设计及工作原理与教程
一、锁设计的哲学为什么需要锁在多线程环境下竞态条件Race Condition是万恶之源。锁的本质是提供一种内存可见性和操作原子性的保证。核心矛盾性能 vs. 安全。锁的设计就是在吞吐量和数据一致性之间寻找平衡点。二、JDK 锁体系架构全景图├── 悲观锁阻塞式 │ ├── synchronizedJVM内置锁 │ └── ReentrantLockAPI级锁 │ ├── 公平/非公平模式 │ └── 可中断/超时机制 ├── 乐观锁非阻塞式 │ └── CAS AtomicXXX硬件级支持 └── 读写锁分离 ├── ReentrantReadWriteLock └── StampedLockJDK 8乐观读三、synchronizedJVM 的亲儿子3.1 底层原理// 代码层面 public synchronized void method() { ... } // 字节码层面 // ACC_SYNCHRONIZED 标志位 → 进入 monitorenter → 退出 monitorexit3.2 锁升级过程JDK 1.6 优化无锁 → 偏向锁 → 轻量级锁CAS自旋 → 重量级锁OS互斥量关键设计思想偏向锁一个线程反复获取锁消除同步开销默认延迟4秒启用轻量级锁多线程交替执行使用CAS自旋避免线程阻塞重量级锁竞争激烈时挂起线程让出CPU3.3 实战示例public class SynchronizedDemo { private int counter 0; // 修饰实例方法锁是当前实例对象 public synchronized void increment() { counter; } // 修饰静态方法锁是Class对象 public static synchronized void staticMethod() { // ... } // 同步代码块更细粒度控制 public void blockLock() { Object lock new Object(); synchronized (lock) { // 临界区代码 } } }四、ReentrantLockAPI 级的全能选手4.1 核心设计架构ReentrantLock └── Sync继承AbstractQueuedSynchronizer ├── NonfairSync非公平默认 └── FairSync公平AQS 核心三要素statevolatile int表示锁状态0未占用0重入次数CLH队列双向链表存储等待线程CAS操作原子更新state4.2 关键源码解析// 非公平锁的 lock() 实现 final void lock() { // 上来先抢一次不管队列非公平核心 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); // 尝试获取失败则入队 } // acquire 流程模板方法模式 public final void acquire(int arg) { if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }4.3 与 synchronized 对比特性synchronizedReentrantLock实现方式JVM内置Java API锁释放自动异常也释放需在finally中unlock()可中断性不支持lockInterruptibly()超时尝试不支持tryLock(timeout)公平性非公平支持公平/非公平条件等待wait/notifyCondition多路通知性能JDK 1.6接近已优化相近4.4 标准使用模式public class ReentrantLockDemo { private final ReentrantLock lock new ReentrantLock(true); // 公平锁 private final Condition condition lock.newCondition(); private int count 0; public void doWork() { lock.lock(); try { // 业务逻辑 count; condition.signalAll(); // 唤醒等待线程 } finally { lock.unlock(); // 必须释放 } } public void waitForCondition() throws InterruptedException { lock.lockInterruptibly(); // 可中断 try { while (count 10) { condition.await(); // 释放锁并等待 } } finally { lock.unlock(); } } }五、读写锁读读并发读写互斥5.1 ReentrantReadWriteLock 设计public class ReadWriteLockDemo { private final ReentrantReadWriteLock rwl new ReentrantReadWriteLock(); private final Lock readLock rwl.readLock(); private final Lock writeLock rwl.writeLock(); private MapString, Object cache new HashMap(); // 读操作多线程可并发 public Object get(String key) { readLock.lock(); try { return cache.get(key); } finally { readLock.unlock(); } } // 写操作独占 public void put(String key, Object value) { writeLock.lock(); try { cache.put(key, value); } finally { writeLock.unlock(); } } }注意陷阱锁降级写锁降级为读锁可行但锁升级读锁升级为写锁会导致死锁5.2 StampedLock乐观读优化JDK 8public class StampedLockDemo { private final StampedLock sl new StampedLock(); private int x 0, y 0; // 乐观读无锁读取验证后决定是否重试 public int distanceFromOrigin() { long stamp sl.tryOptimisticRead(); int curX x, curY y; if (!sl.validate(stamp)) { // 被修改了升级为悲观读 stamp sl.readLock(); try { curX x; curY y; } finally { sl.unlockRead(stamp); } } return (int) Math.sqrt(curX * curX curY * curY); } }适用场景读多写少且读操作可容忍短暂不一致。六、CAS无锁并发基石6.1 原理// 模拟 CAS 操作实际由硬件指令 cmpxchg 支持 public final boolean compareAndSet(int expect, int update) { // 如果当前值 expect则更新为 update // 否则返回 false return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }三大问题ABA问题→ 使用AtomicStampedReference带版本号自旋开销→ 自适应自旋或退让单变量限制→ 使用AtomicReference封装多个变量6.2 原子类实战// 基本类型 AtomicInteger atomicInt new AtomicInteger(0); atomicInt.incrementAndGet(); // i // 引用类型 AtomicReferenceStudent ref new AtomicReference(); ref.compareAndSet(old, new); // 累加器高吞吐量但弱一致性 LongAdder adder new LongAdder(); adder.increment(); long sum adder.sum(); // 最终一致性七、锁优化最佳实践7.1 锁粒度控制// ❌ 坏锁住整个方法 public synchronized void bad() { // 1. 耗时计算不需要同步 // 2. 少量共享数据操作 } // ✅ 好只锁临界区 public void good() { // 耗时计算 synchronized (this) { // 只同步必要部分 } }7.2 锁分离策略// 使用 ThreadLocal 避免锁 ThreadLocalSimpleDateFormat tl ThreadLocal.withInitial(SimpleDateFormat::new); // 使用 ConcurrentHashMap 分段锁JDK 1.7 // JDK 1.8 改为 CAS synchronized 优化7.3 死锁预防// 破坏循环等待统一锁顺序 public void transfer(Account from, Account to, int amount) { // 按 hash 值排序确保获取锁顺序一致 int fromHash System.identityHashCode(from); int toHash System.identityHashCode(to); if (fromHash toHash) { synchronized (from) { synchronized (to) { /* ... */ } } } else { synchronized (to) { synchronized (from) { /* ... */ } } } }7.4 性能对比建议场景推荐方案竞争不激烈代码简单synchronizedJVM优化需要公平锁/中断/超时ReentrantLock读多写少缓存StampedLock乐观读或ReadWriteLock计数器累加LongAdder高并发 MapConcurrentHashMap单变量原子更新AtomicXXX八、面试高频问题Q1synchronized 和 ReentrantLock 性能谁好JDK 1.6 后两者性能相近。synchronized 在低竞争时有偏向锁优化ReentrantLock 在中高竞争时可中断等待更灵活。Q2AQS 中的 state 有什么作用表示锁状态独占模式下 0空闲0重入次数共享模式下表示剩余资源数。Q3公平锁为什么性能比非公平锁差公平锁需要检查等待队列且上下文切换频繁。非公平锁允许插队减少了线程挂起/唤醒开销。Q4锁的可重入性如何实现在持有锁的线程再次获取时判断当前持有线程是否为自身是则 state1释放时 state-1。九、总结锁选型决策树是否需要可中断/超时 ├─ 是 → ReentrantLock └─ 否 → 竞争是否激烈 ├─ 低 → synchronizedJVM帮你优化 └─ 高 → 读多写少 ├─ 是 → StampedLock乐观读 └─ 否 → ReentrantLock Condition记住锁的最佳实践不是用什么锁而是能不能不用锁。无锁化CAS、ThreadLocal、不可变对象才是终极追求。

相关新闻

本地部署AI图像与视频生成:从环境配置到实战应用指南

本地部署AI图像与视频生成:从环境配置到实战应用指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚这个工具到底解决什么问题 看到“最强”“吊打”“炸裂”这类词,先别急着兴奋。这类工具的核心价值&#xff…

2026/7/7 9:33:29阅读更多 →
考霸刷题宝:五年级的暑假冲刺抢跑,决定了孩子小升初的起跑线

考霸刷题宝:五年级的暑假冲刺抢跑,决定了孩子小升初的起跑线

考霸刷题宝:五年级的暑假冲刺抢跑,决定了孩子小升初的起跑线五年级期末考刚结束,不少家长松了一口气——“终于放假了,让孩子好好玩一玩。”但你知道吗?五年级这个暑假,恰恰是小学阶段最不能“躺平”的一个…

2026/7/7 9:33:29阅读更多 →
HEIF Utility:Windows用户的免费高效HEIF格式转换工具终极指南

HEIF Utility:Windows用户的免费高效HEIF格式转换工具终极指南

HEIF Utility:Windows用户的免费高效HEIF格式转换工具终极指南 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 你是否曾经在Windows电脑上收到iPhone…

2026/7/7 9:28:29阅读更多 →
5个步骤彻底告别Windows更新噩梦:这款开源工具让你轻松搞定系统维护

5个步骤彻底告别Windows更新噩梦:这款开源工具让你轻松搞定系统维护

5个步骤彻底告别Windows更新噩梦:这款开源工具让你轻松搞定系统维护 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …

2026/7/7 10:33:40阅读更多 →
第十次课后作业

第十次课后作业

分页显示 在前端代码添加分页控制实现显示 <template><div class"pagination"><el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"currentPage":page-sizes"[10, 20…

2026/7/7 10:33:40阅读更多 →
终极番茄小说下载器:用Rust打造你的免费数字图书馆 [特殊字符]

终极番茄小说下载器:用Rust打造你的免费数字图书馆 [特殊字符]

终极番茄小说下载器&#xff1a;用Rust打造你的免费数字图书馆 &#x1f4da; 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代&#xff0c;你是否曾经为找不到心…

2026/7/7 10:33:40阅读更多 →
字符字符串

字符字符串

一、字符串基础1. 字符串变量声明语法&#xff1a;var 变量名 string赋值要求&#xff1a;字符串内容必须使用 双引号"" 包裹示例&#xff1a;go运行var str1 string str1 "abc" fmt.Println("str1 ", str1)2. len () 内置函数作用&#xff1…

2026/7/7 10:33:40阅读更多 →
G-Helper:华硕笔记本性能调校的轻量级解决方案

G-Helper:华硕笔记本性能调校的轻量级解决方案

G-Helper&#xff1a;华硕笔记本性能调校的轻量级解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertboo…

2026/7/7 10:33:40阅读更多 →
AI平台会员自助充值全攻略:安全避开代充风险

AI平台会员自助充值全攻略:安全避开代充风险

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 不用找代充&#xff01;Claude Pro&#xff5c;GPT Plus/Pro&#xff5c;Grok&#xff5c;Gemini 全平台最全主流会员自助充值通道 在…

2026/7/7 10:28:40阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述&#xff1a;Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵&#xff0c;我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的&#xff0c;就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造&#xff1a;达梦/人大金仓适配与多数据库兼容方案实战&#xff08;SpringBoot&#xff09; &#x1f310; 演示地址&#xff1a;http://ruoyioffice.com | &#x1f4e6; 源码1GitHub&#xff1a;ruoyi-office | &#x1f4e6; 源码2GitCode&#xff1a;ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查&#xff1a;从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时&#xff0c;突然遭遇"Connection refused"或"Connection timed out"的错误提示&#xff0c;这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →