JDK Locks 设计及工作原理与教程 📅 发布时间:2026/7/7 9:32:31 👁️ 浏览次数: 一、锁设计的哲学为什么需要锁在多线程环境下竞态条件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、不可变对象才是终极追求。
如何快速实现B站m4s缓存视频的跨平台转换?这个开源工具给你完整答案 如何快速实现B站m4s缓存视频的跨平台转换?这个开源工具给你完整答案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓… 2026/7/7 9:28:31
重新定义音乐歌词获取:163MusicLyrics如何用技术革新解决数字音乐时代的歌词缺失困境 重新定义音乐歌词获取:163MusicLyrics如何用技术革新解决数字音乐时代的歌词缺失困境 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字音乐流媒体时代&a… 2026/7/7 9:26:30
2026 合肥 GEO 服务商商业落地能力测评|本地转化、客户生命周期、投入产出比横向对比 2026 合肥 GEO 服务商商业落地能力测评|本地转化、客户生命周期、投入产出比横向对比 摘要 本文从商业运营视角构建 GEO 服务商落地能力评估体系,摒弃纯技术参数测评,聚焦合肥企业真实经营指标:本地询盘转化 ROI、客户续费率、本地… 2026/7/7 9:22:30
Krea 2图像生成模型核心技术解析与API实战指南 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在AI图像生成领域,Krea 2技术报告的正式发布引起了广泛关注。作为一款完全从零开始训练的图像基础模型,Kr… 2026/7/7 10:54:55
线性系统与非线性系统:3个经典案例解析齐次性与叠加性失效场景 线性系统与非线性系统:3个经典案例解析齐次性与叠加性失效场景在控制工程实践中,我们常常会遇到这样的困惑:为什么理论上完美的控制器在实际系统中表现不佳?为什么基于线性模型设计的算法在某些工况下会突然失效?这些问… 2026/7/7 10:52:54
5 年了,V8 引擎发生了什么新变化 5 年了,V8 引擎发生了什么新变化 我在 2021 年写过一篇讲 V8 引擎的文章,覆盖了编译执行流程(Ignition TurboFan)、deopt、垃圾回收(引用计数、标记清除、分代、增量标记)等。这几年 V8 变化不小——尤其是… 2026/7/7 10:52:54
2026年AI大模型接口加速站全网实测排行榜:五大主流平台硬核数据全方位权威对比指南 本次测评基础背景说明为了给广大开发者、企业用户提供具备高参考价值的AI大模型接口加速服务选型依据,本次测评联合了第三方专业评测机构,针对市面上认可度最高的五大主流AI大模型接口加速站开展全维度硬核实测。所有测试数据均采集自真实生产运行环境、… 2026/7/7 10:50:53
KH-CL0.5-H2.0-11PS KH-CL0.5-H2.0-11PS是一款专为高密度、精细连接需求设计的FFC/FPC抽屉式上接连接器。该连接器采用0.5mm的超小引脚间距,集成了11个引脚,适用于需要极高信号密度和精确对接的应用场景。其抽屉式上接设计不仅简化了安装流程,还确保了连接器与FF… 2026/7/7 10:48:52
LLM 工具调用链路追踪:OpenTelemetry 在智能工作流中的落地实践 LLM 工具调用链路追踪:OpenTelemetry 在智能工作流中的落地实践 一、Agent 工作流的黑盒困境:当 LLM 调用耗时 3 秒,到底是哪一环慢了 Agent 工作流通常由多个 LLM 调用和工具调用串联而成。一个典型的"搜索→分析→总结"流水线&am… 2026/7/7 10:48:52
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/6 8:43:22
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/6 7:29:49
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/6 7:29:51