synchronized 的可重入性由 JVM 底层 Monitor 的 _Owner 和 _RecursionCount 字段自动维护:首次加锁设 _Owner 为当前线程、_RecursionCount 为 1;重入时仅递增 _RecursionCount;仅当其减至 0 才清空 _Owner 并释放锁。

synchronized 实现可重入,靠的是 JVM 底层 Monitor 的智能识别与计数机制,不是代码逻辑决定的,而是由对象头里的锁状态自动维护。
Monitor 是 synchronized 的“大脑”
每个 Java 对象背后都关联一个 Monitor 结构,它包含三个关键字段:
- _Owner:存储当前持有锁的线程 ID(初始为 null)
- _RecursionCount:记录该线程对这把锁的重入次数(初始为 0)
- _EntryList:存放正在排队等待获取锁的其他线程
加锁时只认“自己人”,不阻塞重入
当线程执行 synchronized 方法或代码块时,JVM 检查对应对象的 Monitor:
- 第一次进入:_Owner 为空 → 把当前线程设为 _Owner,_RecursionCount 设为 1
- 再次进入(如递归调用、嵌套同步块):发现 _Owner 就是当前线程 → 不抢锁、不排队,直接 _RecursionCount + 1
解锁只减次数,归零才真释放
每次退出同步范围(方法返回或代码块结束),JVM 执行 monitorexit:
立即学习“Java免费学习笔记(深入)”;
- 将 _RecursionCount 减 1
- 只有当 _RecursionCount 变成 0 时,才清空 _Owner,真正释放锁
- 中间任何一次减完还大于 0,锁仍被该线程独占
典型例子说明为什么不会死锁
下面这段代码能顺利执行,正是因为可重入机制:
public synchronized void a() {System.out.println("进入 a");
b(); // 再次请求同一把锁
}
public synchronized void b() {
System.out.println("进入 b");
}
线程调用 a() 时拿到锁(_RecursionCount = 1);执行到 b() 时发现还是自己,_RecursionCount 变成 2;b() 返回后减为 1;a() 返回后才减为 0,锁才释放。


















