synchronized通过jvm monitor的_owner和_recursioncount字段实现可重入锁:首次加锁设_owner为当前线程、_recursioncount为1;重入时仅递增计数;退出时减至0才释放锁,避免自死锁。

synchronized 实现可重入锁,靠的是 JVM 底层 Monitor(监视器)中两个关键字段:_Owner 和 _RecursionCount。它不是靠开发者写代码控制,而是由 JVM 自动完成的。
Monitor 中的两个核心字段
每个 Java 对象都关联一个 Monitor,其中:
- _Owner:记录当前持有锁的线程(初始为 null)
- _RecursionCount:记录该线程对这把锁的重入次数(初始为 0)
可重入的三步执行逻辑
当线程执行 synchronized 代码时,JVM 会按以下流程处理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一次加锁:检查 _Owner 为 null → 将 _Owner 设为当前线程,_RecursionCount 置为 1
- 再次进入同一把锁(如递归调用或同步方法内调同步方法):发现 _Owner 等于当前线程 → 直接 _RecursionCount +1,不阻塞
- 退出同步块/方法时:_RecursionCount 减 1;只有减到 0 时,才把 _Owner 置为 null,真正释放锁
为什么必须可重入
如果不支持可重入,会出现自锁死的情况。比如:
- 一个 synchronized 方法 methodA 内部调用另一个 synchronized 方法 methodB(同对象)
- 线程已持锁进入 methodA,再请求 methodB 的锁时会被自己阻塞
- 结果就是线程卡住,无法继续执行,形成死锁
实际表现与验证方式
可重入性在代码中是透明生效的,无需额外声明。常见验证场景包括:
- 实例方法内部递归调用自身(如
public synchronized void f() { f(); }) - 同步方法调用本类其他同步方法(如 methodA → methodB)
- 子类重写父类的 synchronized 方法,并在其中调用
super.method()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










