
大家好我是程序员二叉。简介本篇为Java并发锁核心干货专攻面试必考Synchronized 全套底层机制。包含Synchronized底层Monitor原理、锁升级完整流程、三锁机制对比、不同修饰锁对象归属、偏向锁撤销重偏向、自适应自旋、锁粗化锁消除JVM优化知识点精炼全覆盖适合面试背诵。欢迎点赞关注收藏。一、synchronized 底层原理synchronized是JVM原生悲观可重入互斥锁底层基于ObjectMonitor监视器 对象头Mark Word实现。1. 代码块锁原理编译后生成两条字节码指令monitorenter抢锁monitorexit释放锁2. 方法锁原理无需指令通过方法访问标记位ACC_SYNCHRONIZED隐式加锁。3. 对象头 Mark Word锁状态、线程ID、GC年龄、锁标记全部存在对象头中是锁升级的唯一载体。4. 可重入原理底层维护锁计数器同一线程多次加锁计数器1释放-1归零才算真正释放。二、Synchronized 锁升级完整流程面试必背锁只能单向升级不可逆、不能降级升级链路无锁 → 偏向锁 → 轻量级锁 → 重量级锁1. 偏向锁无竞争场景首个线程获取锁JVM将对象头标记偏向当前线程。后续无需CAS、无需加锁直接进入同步代码。2. 轻量级锁轻微竞争场景出现多线程交替竞争撤销偏向锁。线程在栈帧创建Lock Record通过CAS自旋抢锁用户态运行不阻塞。3. 重量级锁激烈竞争场景自旋多次失败、锁持有时间长、竞争激烈。直接膨胀为重量级锁依托操作系统Monitor抢锁失败线程进入内核阻塞队列。三、偏向锁 / 轻量级锁 / 重量级锁 对比详解1. 偏向锁适用场景单线程重复执行、几乎无竞争核心原理偏向首个线程消除一切同步操作优点性能极高、几乎零开销缺点多线程竞争时撤销伴随STW开销2. 轻量级锁适用场景线程交替执行、锁时间短、竞争轻微核心原理CAS自旋抢锁、用户态空转、不阻塞线程优点无内核切换、响应快、吞吐高缺点高竞争下自旋空转、浪费CPU3. 重量级锁适用场景并发激烈、锁持有时间长、大量线程竞争核心原理内核级互斥阻塞抢不到锁直接挂起线程优点无自旋消耗CPU缺点用户态内核态切换开销最大四、synchronized 四种修饰方式锁对象是谁修饰普通成员方法锁对象this 当前实例对象不同实例互不竞争、互不影响修饰 static 静态方法锁对象当前类 Class 对象全局唯一类锁所有实例共享竞争修饰同步代码块(this)锁对象当前实例对象修饰同步代码块(自定义对象)锁对象自定义任意 Object 锁对象五、偏向锁撤销 批量重偏向1. 偏向锁撤销触发场景多线程发生锁竞争调用对象hashCode()主动争抢偏向锁撤销需要STW 暂停清空偏向线程ID升级为轻量级锁。2. 批量重偏向JVM优化针对同一类对象撤销次数≥20次开启批量重偏向直接偏向新竞争线程撤销次数≥40次直接关闭当前类的偏向锁目的解决大量偏向锁撤销导致的性能抖动。六、轻量级锁 — 自适应自旋JDK1.6优化摒弃固定自旋次数JVM动态自适应调节上次自旋成功抢锁 → 本次自旋次数增加上次自旋频繁失败 → 减少自旋次数、甚至不自旋极大减少无效CPU空转适配真实并发场景。七、JVM两大锁优化锁粗化 锁消除1. 锁粗化场景循环内频繁加锁、解锁JVM优化合并多次细粒度锁为一次大锁减少频繁monitor切换开销提升执行效率2. 锁消除场景局部锁对象、无逃逸、不共享JVM通过逃逸分析判断无多线程竞争直接消除锁代码彻底去除同步开销面试速记总结Synchronized 底层依托ObjectMonitor 对象头MarkWord锁升级无锁→偏向→轻量→重量单向不可逆偏向锁适配无竞争、轻量级适配低竞争、重量级适配高竞争普通方法锁实例、静态方法锁Class类对象偏向锁支持撤销、批量重偏向解决竞争性能问题JVM优化自适应自旋、锁粗化、锁消除