☰
第三章 synchronized 底层实现原理(JDK1.8,面试必背)
2026/10/10 2:41:55 网站建设 项目流程

定位:synchronized是JVM内置的关键字锁,锁信息存在对象头(Mark Word)中,支持自适应锁升级,是Java并发面试的核心高频题。

一、synchronized 核心特性总览

对应6大锁策略维度的完整属性:

  1. 悲观/乐观:自适应初始默认冲突概率低,偏向乐观思路;检测到锁竞争频繁,自动切换为悲观锁。
  2. 轻量/重量:自适应初始为轻量级锁(用户态CAS实现);竞争加剧后升级为重量级锁(依赖操作系统mutex)。
  3. 自旋/挂起:自适应轻量级锁阶段使用自适应自旋抢锁;重量级锁阶段抢锁失败则线程挂起休眠。
  4. 读写锁:不是读写锁属于普通互斥锁,读、写操作全部互斥,不支持读读并发。
  5. 可重入:是可重入锁同一个线程可多次获取同一把锁,内部通过「持有线程ID + 加锁计数器」实现,不会自己锁死自己。
  6. 公平性:非公平锁不保证先来先得,锁释放后所有等待线程随机竞争,可能出现线程饥饿。

二、锁升级完整流程(只能升级,不能降级)锁升级也是在“性能”和“线程安全之间相权衡”

JVM将锁分为4种状态,根据竞争程度依次升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁。

1. 无锁状态

对象没有被任何线程加锁,对象头标记为无锁状态。

2. 偏向锁(因为是运行时的事情,编译阶段无法判定锁必要所以保守留了锁)

核心思想:延迟加锁,针对「只有一个线程使用锁」的场景做优化,尽量避免加锁开销。

  • 操作:第一个线程访问锁时,不做真正的加锁操作,只在对象头标记「偏向线程ID」。
  • 同线程再次访问:判断对象头偏向的是自己,无需任何同步操作,直接进入临界区。
  • 触发升级:一旦出现第二个线程来竞争锁,立刻撤销偏向锁,升级为轻量级锁。

通俗比喻:只有女主一个人用男主(锁),不用领证(加锁)也能正常生活;一旦出现女配竞争,就必须领证(真正加锁),让对方死心。

3. 轻量级锁(自适应自旋锁)

核心:在用户态通过CAS完成加锁,不调用操作系统内核锁,避免内核态切换。

  • 加锁过程:线程在自己栈帧中创建锁记录,通过CAS尝试把对象头的锁指针指向自己的锁记录。
    • CAS成功 → 加锁成功
    • CAS失败 → 说明锁已被占用,自适应自旋重试(循环尝试抢锁,不放弃CPU)
  • 自适应逻辑:自旋不会无限持续,达到一定次数/时间仍拿不到锁,就停止自旋,升级为重量级锁。

特点:竞争不激烈时性能极高;但锁持有时间长时,自旋会持续消耗CPU。

4. 重量级锁

核心:依赖操作系统内核的mutex互斥锁,抢锁失败线程直接挂起休眠。

  • 加锁流程:
    1. 线程执行加锁,先进入内核态
    2. 内核判断当前锁是否空闲
    3. 空闲:加锁成功,切换回用户态
    4. 被占用:加锁失败,线程进入锁等待队列,挂起休眠
    5. 锁被释放后,操作系统唤醒等待线程,重新尝试抢锁

特点:线程挂起不消耗CPU,但用户态↔内核态切换开销大,响应慢;适合锁持有时间长、竞争激烈的场景。


三、JVM 自动锁优化(编译器+JVM共同完成,开发者无感知)

1. 锁消除(这个是编译过程中还没到运行时)

场景:代码写了synchronized,但实际不存在多线程竞争。JVM+编译器判断锁没有逃逸出当前线程,就会直接把锁消除,省去加锁解锁的无用开销。

例子:单线程中使用StringBuffer,每个append方法都带synchronized;但单线程下没有线程安全问题,JVM会直接消除锁。

2. 锁粗化

场景:一段代码频繁加锁、解锁,相邻多次操作同一把锁。JVM会把多次细粒度的锁,合并成一次粗粒度的锁,避免频繁申请释放锁的开销。

通俗比喻: 方式一:打三次电话,每次交代一个任务就挂(细粒度锁,频繁加解锁) 方式二:打一次电话,交代全部三个任务(锁粗化,一次加锁处理全部) 方式二效率更高。

典型场景:循环体内部加锁,JVM可能把锁粗化到循环外面。

粒度细的时候能够能够并发执行的逻辑更多,更有利于充分利用多核cpu资源,但是如果粒度细的锁被反复进行加锁解锁,可能实际效果还不如粒度粗的锁(涉及到反复锁竞争)


四、面试高频标准答法

  1. 什么是偏向锁?偏向锁是synchronized针对单线程用锁场景的优化。只在对象头标记偏向的线程ID,不做真正加锁;同一个线程访问无需同步开销。出现其他线程竞争时,撤销偏向锁,升级为轻量级锁。
  2. synchronized的实现原理是什么?synchronized基于对象头Mark Word实现锁状态管理,支持自适应锁升级: 初始无锁,单线程访问进入偏向锁;出现竞争升级为轻量级锁,通过CAS+自适应自旋实现;竞争进一步加剧升级为重量级锁,依赖操作系统mutex互斥锁,线程抢锁失败挂起等待。同时JVM还会进行锁消除、锁粗化等自动优化。
  3. synchronized锁可以降级吗?不可以,锁只能按照竞争程度从低到高升级,不能降级。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询