对象级别锁定以具体实例为锁,确保同一时刻仅一个线程执行其同步代码;推荐用private final object lock = new object()显式加锁,避免this或公共对象引发干扰;锁可重入、作用于单个实例、异常或结束时自动释放。

对象级别锁定是 synchronized 最常用的形式,核心在于“锁住某个具体对象实例”,确保同一时刻只有一个线程能执行该实例的同步代码,从而保护该对象的非静态成员变量不被并发修改。
锁的目标是 this 实例
当修饰非静态方法或使用 synchronized(this) 时,锁对象就是当前正在调用方法的那个对象(即 this)。不同实例互不影响——A 对象的同步方法在执行,B 对象的同样方法仍可并行执行。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
同步方法写法:
public synchronized void update() { ... }—— 隐式以this为锁 -
同步代码块写法:
synchronized(this) { ... }—— 显式指定锁对象为当前实例
推荐显式使用私有 final 锁对象
避免直接用 this 或公共对象(如 String、Integer)作锁,防止外部误操作导致锁失效或死锁。应定义一个私有的、不可变的锁对象:
- 声明为
private final Object lock = new Object(); - 在方法中用
synchronized(lock) { ... } - 这样锁对象完全受控,不会被其他代码意外干扰
关键行为特征
一个对象一旦被某线程持有了对象锁,其他线程对该对象的任意 synchronized 方法或 synchronized(this) 块都会被阻塞,直到锁释放。但非同步方法、其他对象的同步方法、静态方法不受影响。
- 锁是可重入的:同一线程可多次进入自己已持有的对象锁同步区
- 锁作用范围仅限于该实例:100 个
DemoClass实例就有 100 把独立的锁 - 锁释放时机:方法自然结束、抛出未捕获异常、或代码块执行完毕
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










