可重入性体现为同一线程持有锁后能再次进入同锁保护的synchronized方法或代码块而不被阻塞;常见于同一对象内synchronized方法相互调用及递归调用,每次进入计数器加1。

synchronized 的可重入性在代码中最直接的体现,是同一个线程能在已持有锁的前提下,再次进入被同一把锁保护的其他 synchronized 方法或代码块,而不会被自己阻塞。
同一对象内方法间相互调用
这是最常见、最直观的体现方式。当一个 synchronized 实例方法内部调用本类另一个 synchronized 方法时,由于锁对象(this)相同,且当前线程已是持有者,JVM 允许直接进入,不会等待也不会死锁。
示例:
public class SyncReentrantDemo {
public synchronized void methodA() {
System.out.println("进入 methodA");
methodB(); // 同一线程再次请求 this 锁 → 成功(可重入)
}
public synchronized void methodB() {
System.out.println("进入 methodB");
// 可继续调用其他同步方法,或递归调用自身
}
}
递归调用自身
一个 synchronized 方法直接或间接调用自己,也是可重入性的典型验证场景。每次进入都会使 Monitor 中的重入计数器 +1,直到栈溢出前都不会卡住。
示例:
public synchronized void recursive() {
System.out.println("递归第 " + (++count) + " 层");
if (count
父子类中同步方法的继承调用
子类重写父类的 synchronized 方法,并在重写方法中调用 super.method(),此时会再次尝试获取同一把锁(父类方法锁的仍是子类实例对象),同样成功。
示例:
class Parent {
public synchronized void doWork() {
System.out.println("Parent doing work");
}
}
class Child extends Parent {
@Override
public synchronized void doWork() {
System.out.println("Child preparing...");
super.doWork(); // 调用父类同步方法 → 同一线程、同一锁对象 → 可重入
}
}
同步代码块与同步方法混用
只要锁对象一致(如都用 this 或都用某个共享对象),synchronized 方法和 synchronized(this) { ... } 代码块之间也能自由嵌套调用。
例如:
public synchronized void outer() {
System.out.println("outer start");
synchronized (this) { // 等价于 outer 的锁,重入成功
System.out.println("in synchronized block");
}
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











