
本文深入解析java中synchronized方法和synchronized块的底层锁行为,明确指出:同一对象实例的多个synchronized方法或块共享同一个 intrinsic lock(即this锁),因此会相互阻塞;并给出更安全、更可控的私有锁实践方案。
本文深入解析java中synchronized方法和synchronized块的底层锁行为,明确指出:同一对象实例的多个synchronized方法或块共享同一个 intrinsic lock(即this锁),因此会相互阻塞;并给出更安全、更可控的私有锁实践方案。
在Java中,synchronized关键字作用于实例方法时,其本质是以当前对象(this)为监视器(monitor)加锁。这意味着:
- 所有被声明为 public synchronized void methodA() 和 public synchronized void methodB() 的方法,无论方法名、参数或逻辑如何不同,只要它们属于同一个对象实例,就共用同一把内置锁(intrinsic lock);
- 当线程 t1 进入 methodA 并成功获取 this 锁后,线程 t2 尝试进入同一实例的 methodB 时,将因无法获取该锁而被阻塞,直至 t1 释放锁(即 methodA 执行完毕)。
这与使用 synchronized(this) 块完全等价。例如,以下两种写法语义完全一致:
// 写法一:synchronized 方法
public synchronized void methodA() {
// critical section
}
// 写法二:等价的 synchronized 块
public void methodA() {
synchronized (this) {
// critical section
}
}
同样地,若类中存在多个 synchronized(this) 块(如分别保护不同资源),它们也共享同一把锁,彼此互斥。例如:
class A {
private int counter = 0;
private String name = "default";
public void updateCounter() {
synchronized (this) {
counter++;
}
}
public void updateName(String newName) {
synchronized (this) {
name = newName;
}
}
}
即使 updateCounter() 和 updateName() 操作的是完全无关的字段,只要它们都同步在 this 上,两个线程对同一实例调用这两个方法时仍会串行执行——这是典型的锁粒度过粗问题,易导致不必要的性能瓶颈。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
⚠️ 更关键的风险在于:this 锁本质上是“公开”的(public lock)。任何外部代码只要持有该对象引用,即可执行 synchronized(obj) { ... },从而意外参与锁竞争,破坏封装性与可维护性。这违背了面向对象设计中“封装内部同步策略”的原则。
✅ 推荐做法:使用私有且不可变的锁对象,显式控制同步边界:
class A {
private final Object lock = new Object(); // 私有锁,外部不可访问
private int counter = 0;
private String name = "default";
public void updateCounter() {
synchronized (lock) {
counter++;
}
}
public void updateName(String newName) {
synchronized (lock) {
name = newName;
}
}
}
✅ 优势说明:
- 封装性强:lock 是 private final,外部无法获取或干扰;
- 语义清晰:明确标识哪些操作需互斥,避免误用 this;
- 可扩展性好:未来可为不同资源定义多个独立锁(如 counterLock、nameLock),实现细粒度并发控制。
? 总结:
- 同一对象的多个 synchronized 实例方法或 synchronized(this) 块,必然竞争同一把锁,相互阻塞;
- 默认使用 this 作为锁虽简洁,但牺牲了封装性与可控性;
- 生产代码中应优先采用私有锁对象,并按实际并发需求合理划分锁粒度——这是编写健壮、可维护并发程序的重要实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










