Synchronized底层原理
synchronized 是 Java 内置的悲观锁底层基于 JVM 指令 对象头 MarkWord 监视器锁Monitor 实现。一、底层核心组成字节码层面最基础synchronized 修饰方法 / 代码块编译后生成两条指令• monitorenter获取锁进入临界区• monitorexit释放锁退出临界区会生成2条保证异常也能释放对象头 MarkWord锁的存储位置Java 对象在内存中分为对象头 实例数据 对齐填充其中 MarkWord 记录• 锁状态无锁、偏向锁、轻量级锁、重量级锁• 线程ID、epoch、GC分代年龄等二、锁的4种状态升级顺序不可逆无锁 → 偏向锁 → 轻量级锁 → 重量级锁只能升级不能降级偏向锁单线程竞争少• 场景只有一个线程在使用锁• 原理MarkWord 记录线程ID下次直接获取不做CAS• 优点性能极高几乎无开销• 缺点多线程竞争时失效轻量级锁多线程交替执行• 场景多个线程交替执行不并发争抢• 原理自旋CAS不阻塞线程基于自旋锁• 优点不阻塞性能好• 缺点自旋消耗CPU重量级锁高并发竞争激烈• 场景大量线程同时争抢• 原理依赖操作系统 OS互斥锁Mutex线程阻塞进入等待队列• 优点保证安全• 缺点线程阻塞、上下文切换开销大三、Monitor 监视器锁重量级锁核心每个对象都有一个 ObjectMonitor内部结构ObjectMonitor {_owner: 持有锁的线程_WaitSet: 等待池wait()线程_EntryList: 阻塞池竞争锁失败线程_count: 锁计数器可重入}• 线程获取锁 → _owner 标记为当前线程• 重入_count• 释放_count–为0时唤醒等待线程四、可重入原理synchronized 是可重入锁同一个线程多次获取同一把锁不会阻塞。底层靠 ObjectMonitor 的 count 计数器实现获取锁 count1释放 count-1count0 才真正释放。五、synchronized 与 Lock 区别高频面试synchronized 是 JVM 层面Lock 是 API 层面synchronized 自动释放锁Lock 必须手动 unlockLock 支持公平/非公平锁、条件变量、可中断、超时获取底层synchronized 依赖 MonitorLock 依赖 AQS