synchronized 的可重入性由 JVM 通过 Monitor 自动保障,其核心是 _Owner 字段记录持有锁的线程 ID,_RecursionCount 字段统计该线程重入次数,仅当计数归零才真正释放锁。

synchronized 的可重入性不是靠代码写出来的,而是 JVM 在底层通过 Monitor 自动保障的。关键就两点:锁只认“自己人”,并且会数“进了几次门”。
Monitor 是 synchronized 的执行中枢
每个 Java 对象背后都关联一个 Monitor 结构,它像一把智能门禁系统,内部有三个核心字段:
- _Owner:存当前持有锁的线程 ID(初始为 null)
- _RecursionCount:记录该线程对这把锁的重入次数(初始为 0)
- _EntryList:存放排队等待锁的其他线程
加锁时:只增计数,不阻塞自己
当线程进入 synchronized 方法或代码块,JVM 会检查对应对象的 Monitor:
- 第一次进来:_Owner 为空 → 把当前线程设为 _Owner,_RecursionCount 设为 1
- 再次进来(比如递归调用、嵌套同步块):发现 _Owner 就是当前线程 → 不排队、不阻塞,直接 _RecursionCount + 1
解锁时:只减计数,归零才放锁
每次退出同步范围(方法结束或代码块执行完),JVM 都会做一件事:
- 将 _RecursionCount 减 1
- 只有当 _RecursionCount 变成 0 时,才清空 _Owner,真正释放锁
- 只要 _RecursionCount > 0,锁就仍被该线程独占,其他线程无法获取
典型场景验证逻辑
下面这段代码能顺利运行,正是靠这个机制:
public synchronized void a() {System.out.println("进入 a");
b(); // 再次请求同一把锁
}
public synchronized void b() {
System.out.println("进入 b");
}
主线程调用 a() → _Count = 1;执行 b() → _Count = 2;b() 返回 → _Count = 1;a() 返回 → _Count = 0 → 锁释放。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











