synchronized代码块通过指定锁对象实现细粒度同步,推荐用private final object作锁,避免字符串或integer等常量池对象,以防止意外串行。

synchronized 代码块是 Java 中实现细粒度线程同步的核心方式,它不锁整个方法,只锁定真正需要保护的临界区代码,兼顾安全性与性能。
基本语法和锁对象选择
语法为 synchronized(锁对象) { ... },关键在于“锁什么”:
- 锁
this:等价于实例同步方法,保护当前对象的共享状态 - 锁
MyClass.class:全局类级别锁,所有该类的静态资源或跨实例协调场景适用 - 锁私有 final 对象(推荐):如
private final Object lock = new Object();,避免外部干扰,封装性好 - 避免用字符串字面量、Integer 等常量池对象作锁——不同位置的相同字面量可能指向同一对象,导致意外串行
典型使用场景示例
比如账户转账,只需同步余额变更逻辑,而非整个方法:
复制代码
private final Object balanceLock = new Object();
public void transfer(Account to, double amount) {
// 非关键操作(如日志、校验)无需同步
if (amount
<h3>常见错误与规避要点</h3>
- 锁对象不一致:同一组共享变量必须始终用同一个锁对象保护,否则起不到同步效果
- 只同步写、不同步读:读操作也需在相同锁下进行,否则可能读到过期值
- 锁范围过大:把无关语句包进 synchronized 块会降低并发度
- 锁对象被外部修改或暴露:如将
public Object lock暴露出去,其他代码误用会导致同步失效或死锁
和同步方法的本质区别
同步方法本质是语法糖,编译后也会转为 monitorenter/monitorexit 指令,但锁对象固定:
- 实例方法 → 锁
this - 静态方法 → 锁
MyClass.class - 代码块 → 锁任意指定对象,灵活可控,适合多资源协作或部分同步
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











