synchronized通过对象内置锁(monitor)实现互斥:实例方法锁this,静态方法锁class对象;monitorenter/monitorexit指令保障加锁解锁;支持可重入;jvm自动管理,异常时仍安全释放。

synchronized 通过对象内置锁(monitor)实现方法的互斥访问:同一时刻,只有一个线程能持有该对象的锁,从而独占执行被 synchronized 修饰的方法。
锁的对象决定互斥范围
被 synchronized 修饰的实例方法,锁的是当前实例(this);静态方法,锁的是当前类的 Class 对象(如 MyClass.class)。两者互不影响,因为锁对象不同。
- 两个线程调用同一个对象的 synchronized 实例方法 → 互斥
- 两个线程调用不同对象的 synchronized 实例方法 → 不互斥(各自锁各自的对象)
- 一个线程调用实例方法,另一个调用 static synchronized 方法 → 不互斥(对象锁 vs 类锁)
底层靠 monitorenter/monitorexit 指令保障
JVM 在编译 synchronized 方法时,自动在入口插入 monitorenter,在正常结束和异常出口插入 monitorexit。线程执行到 monitorenter 时尝试获取锁对象的 monitor;获取失败则阻塞等待;获取成功后才能进入方法体。异常发生时,JVM 保证自动执行 monitorexit,不会死锁。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
可重入,避免同一线程自锁
同一个线程可以重复获取它已经持有的锁。例如,在 synchronized 方法 A 中调用本对象另一个 synchronized 方法 B,不会被自己阻塞。这是因为 monitor 内部维护了持有线程和计数器,每次重入计数 +1,每次退出 -1,直到归零才真正释放锁。
不依赖手动释放,安全可靠
不同于显式 Lock,synchronized 是 JVM 层面的内置锁机制,无需手动 lock()/unlock()。即使方法中抛出异常,锁也会由 JVM 自动释放,使用简单且不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










