synchronized 锁的是对象实例或class对象:实例方法锁this,静态方法锁class对象,代码块锁指定对象;底层通过monitorenter/monitorexit指令配合jvm锁优化机制实现;作用范围限于修饰的代码块或方法体。

synchronized 是 Java 中最基础的同步机制,它通过 JVM 内置的监视器(Monitor)实现对代码段的加锁,本质是基于对象的内部锁(也叫“内置锁”或“monitor lock”)。
锁的对象是哪个?
使用 synchronized 时,实际锁定的是一个对象实例(或 Class 对象):
- 修饰实例方法:锁的是当前调用该方法的对象(this)
- 修饰静态方法:锁的是该类的 Class 对象(如
MyClass.class) - 修饰代码块:synchronized(obj) 锁的是括号中指定的对象引用
底层靠什么实现加锁?
JVM 在字节码层面通过两条指令控制锁的获取与释放:
- monitorenter:进入同步块时执行,尝试获取对象监视器。若锁空闲则获得并计数+1;若已被同一线程持有,则重入计数+1(Java 的 synchronized 是可重入锁)
- monitorexit:退出同步块时执行,释放锁(重入计数-1,减到 0 才真正释放)
这些操作由 JVM 直接调用操作系统互斥量(mutex)或利用 CPU 的原子指令(如 CAS、LOCK 前缀)实现,具体取决于锁的状态(偏向锁 → 轻量级锁 → 重量级锁)。
加锁范围怎么确定?
锁的作用范围只在 synchronized 修饰的代码边界内有效:
- 方法级别的 synchronized:整个方法体都是临界区
- 代码块级别的 synchronized:只有大括号
{...}内的语句受保护 - 注意:锁一旦释放,其他线程才能进入——哪怕只是抛异常、return 或正常执行完
常见误区提醒
容易误以为 synchronized 锁住的是“代码”,其实它锁的是“对象”:
- 两个线程分别调用不同对象的 synchronized 实例方法,不会互斥
- 同一个对象的多个 synchronized 方法,共享同一把锁,会串行执行
- 用 new Object() 作为锁对象时,确保所有线程使用的是同一个对象引用,否则形同虚设
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











