synchronized 的重入性不是语法糖,而是关键设计特性:它允许同一线程多次获取同一对象锁,避免自死锁,支持方法嵌套调用、继承体系协同及职责分层,由JVM通过线程标识+计数器自动管理。

Java 中 synchronized 的重入性不是语法糖,而是保障代码逻辑可组合、可维护的关键设计特性。它让同一个线程在持有锁的前提下,能安全调用本对象(或父类)的其他同步方法,避免了“自己卡死自己”的死锁风险,大幅降低了并发场景下的开发复杂度。
避免嵌套调用时的自死锁
当一个同步方法内部需要调用另一个同步方法时,若锁不可重入,线程会在第二次尝试获取同一把锁时被永久阻塞——因为第一次的锁还没释放,而线程又等不到自己释放锁。重入性直接消除了这种逻辑陷阱。
- 比如
doWork()是synchronized方法,内部调用logAndSave()(也是synchronized),无需额外解锁/加锁或改用非同步方式 - 子类重写父类同步方法并调用
super.method()时,也能顺利执行,否则会立即死锁
支持更自然的代码分层与复用
重入性让开发者可以按职责拆分同步逻辑,而不必担心锁粒度带来的耦合问题。方法之间可以像普通调用一样协作,同步语义由 JVM 自动延续。
- 公共的校验逻辑封装为独立同步方法,被多个业务同步方法调用
- 资源初始化、状态更新、日志记录等步骤各自封装为同步方法,再由主流程组合调用
- 无需为规避重入问题而把大块逻辑硬塞进一个方法,或手动管理锁的释放时机
降低并发编程的认知负担
重入性是 JVM 对“线程级锁归属”而非“调用级锁请求”的实现体现。开发者只需关注“谁在操作共享资源”,不用操心“这次调用算不算新申请锁”。
立即学习“Java免费学习笔记(深入)”;
- 每个对象锁背后维护一个持有线程标识 + 计数器:进入一次 +1,退出一次 -1,归零才真正释放
- 这意味着方法递归、A→B→C 的同步链路、甚至异常退出后的自动计数器回退,都由 JVM 保证正确性
- 相比
ReentrantLock需显式lock()/unlock(),synchronized的重入对使用者完全透明
与继承体系协同工作
重入性天然适配面向对象的继承关系。子类同步方法调用父类同步方法时,锁的重入机制确保父子方法共用同一把对象锁,语义连贯且线程安全。
- 例如
LoggingList.add()是同步的,内部调用super.add()(父类ArrayList虽不加synchronized,但自定义父类可同步) - 若没有重入性,子类每次调用
super.xxx()都需额外判断是否已持锁,极易出错 - 这也使得模板方法模式(Template Method Pattern)在并发环境下仍可安全使用


















