synchronized修饰实例方法即对当前对象(this)加锁,同一对象的多个synchronized实例方法互斥,不同对象间不干扰;锁可重入,但不保护静态变量,适用于保护单个对象内部状态。

synchronized 修饰实例方法,就是给当前对象(this)加锁。只要线程想执行这个方法,就必须先拿到该对象的监视器锁(monitor lock),其他线程若同时调用同一个对象的该方法,就会被阻塞,直到锁释放。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
锁对象是 this,不是类也不是其他东西
- 每个对象实例都有自己的锁;
- 不同实例之间的
synchronized实例方法完全不干扰; - 同一实例的多个
synchronized实例方法之间互斥(同一时刻只能一个线程进入)。
public class Counter {
private int count = 0;
// synchronized 修饰实例方法 → 锁的是 this
public synchronized void increment() {
count++;
}
// 等价写法:用同步代码块显式锁 this
public void increment2() {
synchronized (this) {
count++;
}
}
}实际效果看两个例子
✅ 同一个对象,多线程调用 → 串行执行
Counter c = new Counter();
new Thread(() -> { for (int i = 0; i < 1000; i++) c.increment(); }).start();
new Thread(() -> { for (int i = 0; i < 1000; i++) c.increment(); }).start();
// 最终 c.count 很大概率是 2000(线程安全)❌ 不同对象,各自调用 → 并行执行,不互斥
Counter c1 = new Counter();
Counter c2 = new Counter();
new Thread(() -> { for (int i = 0; i < 1000; i++) c1.increment(); }).start();
new Thread(() -> { for (int i = 0; i < 1000; i++) c2.increment(); }).start();
// c1 和 c2 的锁无关,各自内部安全,但无法保护跨对象共享状态注意点
- 不能靠
synchronized实例方法保护静态变量或类级别资源; - 如果需要保护所有实例共用的数据(比如静态计数器),应该用
synchronized static方法或synchronized(Counter.class); - 实例方法加锁会锁住整个方法体,若方法体长、非临界操作多,会影响并发性能;此时更适合用同步代码块精准包裹临界区;
-
synchronized实例方法是可重入的:同一个线程可以反复进入自己已持有的锁对应的方法。
小结:怎么写?怎么理解?
- 写法:在返回类型前加
synchronized,如public synchronized void doWork() { ... }; - 锁目标:调用该方法的那个对象(
this); - 作用范围:仅对该对象生效,不同对象互不影响;
- 适用场景:保护单个对象内部的状态一致性,比如账户余额、订单状态等。
不复杂但容易忽略细节。

















