synchronized方法级锁本质是jvm自动插入monitorenter/monitorexit指令,实例方法锁this、静态方法锁class对象,支持重入且隐式释放。

Java 中 synchronized 实现方法级别的临界区控制,本质是让整个方法体成为临界区——即同一时刻最多只有一个线程能执行该方法(针对同一锁对象)。它不依赖手动加锁/解锁,而是由 JVM 在字节码层面自动插入 monitorenter 和 monitorexit 指令完成。
关键点在于锁对象的选择:
- 实例方法加
synchronized→ 锁的是当前实例(this) - 静态方法加
synchronized→ 锁的是该类的Class对象
这意味着:
- 不同实例的同步实例方法可并发执行(锁不同)
- 所有实例共享同一个类锁,静态同步方法之间互斥
- 实例方法和静态方法之间不互相阻塞(锁对象不同)
典型写法:
public class Counter {
private int count = 0;
// 实例同步方法:锁 this
public synchronized void increment() {
count++; // 这段代码就是临界区
}
// 静态同步方法:锁 Counter.class
public static synchronized void resetAll() {
// 操作静态资源,所有调用都串行化
}
}
实际效果:
- 线程 A 调用
obj.increment()时,先尝试获取obj的监视器锁 - 若成功,进入方法体执行;若失败(已被其他线程持有),则阻塞等待
- 方法执行完毕(正常结束或异常退出),JVM 自动释放锁,唤醒等待线程
注意事项:
- 方法级锁粒度较粗,可能影响并发性能,尤其当方法体包含非共享资源操作时
- 同一线程可重入:已持有锁的线程可再次进入该对象的其他
synchronized方法 - 锁的释放是隐式的、可靠的,不受 return 或异常影响
这种机制简单直接,适合逻辑清晰、临界区覆盖整方法的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











