java synchronized偏向锁、轻量级锁、重量级锁

发布时间:2026/5/28 5:10:28

java synchronized偏向锁、轻量级锁、重量级锁 要理解 Java 中的偏向锁、轻量级锁、重量级锁首先要明确这三种锁是 synchronized 关键字的锁升级机制JDK 1.6 引入目的是降低锁的开销核心是根据竞争程度动态调整锁的形态从无竞争到高竞争锁会逐步从偏向锁 → 轻量级锁 → 重量级锁升级不可逆。一、核心背景为什么需要锁升级在 JDK 1.6 之前synchronized 是纯粹的重量级锁—— 依赖操作系统的互斥量Mutex实现每次加锁 / 解锁都需要切换内核态用户态 ↔ 内核态开销极大。但实际开发中大部分场景下 synchronized 锁定的代码块竞争非常小甚至只有一个线程执行因此 JVM 针对不同竞争程度设计了分级锁无竞争 → 偏向锁几乎无开销轻度竞争 → 轻量级锁自旋锁避免内核态切换重度竞争 → 重量级锁操作系统互斥量保证线程安全。二、三种锁的详细解析1. 偏向锁Biased Locking核心特点适用场景无竞争只有一个线程反复获取同一把锁核心思想锁会 “偏向” 第一个获取它的线程后续该线程再次获取锁时无需任何同步操作连 CAS 都不用直接执行实现原理线程第一次获取偏向锁时会在对象头的 “Mark Word” 中记录自己的线程 ID后续该线程进入 / 退出同步块时只需检查 Mark Word 中的线程 ID 是否为自己是 → 直接进入无任何开销否 → 触发锁升级。public class BiasedLockDemo { private static final Object lock new Object(); public static void main(String[] args) { // 单线程反复获取锁触发偏向锁 for (int i 0; i 10000; i) { synchronized (lock) { // 无其他线程竞争始终是偏向锁 System.out.println(当前线程 Thread.currentThread().getName()); } } } }关键细节偏向锁默认是延迟启动的JVM 启动后约 4 秒可通过 JVM 参数 -XX:-UseBiasedLocking 关闭偏向锁偏向锁的释放不需要主动操作只有当其他线程尝试获取锁时才会撤销偏向锁触发锁升级。2. 轻量级锁Lightweight Locking核心特点适用场景轻度竞争多个线程交替获取锁无长时间阻塞核心思想用自旋锁CAS 操作 替代操作系统互斥量避免内核态切换实现原理线程获取轻量级锁时会在自己的栈帧中创建 “锁记录”Lock Record并将对象头的 Mark Word 复制到锁记录中通过 CAS 操作将对象头的 Mark Word 替换为指向锁记录的指针CAS 成功 → 获取锁执行同步代码CAS 失败 → 线程自旋循环重试 CAS自旋次数达到阈值后升级为重量级锁。关键细节自旋锁的自旋次数JDK 1.6 后默认自适应根据前一次自旋的成功率调整也可通过 -XX:PreBlockSpin 指定固定次数轻量级锁的释放通过 CAS 将对象头的 Mark Word 恢复为原始值成功则释放锁失败则说明锁已升级为重量级锁。3. 重量级锁Heavyweight Locking核心特点适用场景重度竞争多个线程同时争抢锁自旋无法获取核心思想依赖操作系统的互斥量Mutex 实现线程获取不到锁时会进入阻塞状态放弃 CPU实现原理锁升级为重量级锁后对象头的 Mark Word 会指向一个 “监视器Monitor” 对象Monitor 维护了一个等待队列未获取到锁的线程会被放入队列并阻塞持有锁的线程释放锁时会唤醒队列中的线程竞争锁。关键细节重量级锁的最大开销线程阻塞 / 唤醒需要切换内核态用户态 ↔ 内核态这是一个非常耗时的操作重量级锁是 synchronized 的 “最终形态”一旦升级不会再降级为轻量级锁 / 偏向锁。三、锁升级的完整流程用流程图直观展示锁的升级过程第一个线程获取锁四、三种锁的核心对比锁类型适用场景实现方式性能开销线程状态偏向锁无竞争单线程记录线程 ID无同步操作几乎无开销轻量级锁轻度竞争交替获取自旋 CAS 操作低开销用户态运行态自旋不阻塞重量级锁重度竞争同时争抢操作系统 MutexMonitor 队列高开销内核态阻塞态放弃 CPU五、实战调优建议偏向锁调优适合单线程频繁操作同步块的场景如单线程循环加锁如果程序中多线程竞争激烈可通过 -XX:-UseBiasedLocking 关闭偏向锁避免偏向锁撤销的开销。轻量级锁调优适合短时间、低竞争的同步块自旋能快速获取锁避免同步块执行时间过长自旋会浪费 CPU 资源。重量级锁规避尽量缩小同步块的范围仅包裹核心并发逻辑高并发场景下可考虑用 java.util.concurrent 包的锁如 ReentrantLock替代 synchronized支持更灵活的锁策略。总结核心逻辑synchronized 的锁升级是 “按需升级”从无竞争到高竞争锁的开销逐步增大兼顾了低竞争下的性能和高竞争下的安全性性能优先级偏向锁 轻量级锁 重量级锁使用原则根据业务的竞争程度选择或让 JVM 自动适配低竞争用偏向 / 轻量级锁高竞争需优化代码减少锁争抢。

相关新闻