stringbuffer 的 synchronized 锁对象是 this,因为其 public synchronized 实例方法由 jvm 绑定到当前对象,每个实例拥有独立锁,确保线程安全且避免过度串行化。

StringBuffer 方法中 synchronized 的锁对象是该 StringBuffer 实例本身,也就是 this。
为什么是 this?
StringBuffer 所有公开的修改方法(如 append()、insert()、delete()、reverse())都声明为 public synchronized。这种修饰方式对应的是实例方法级同步,JVM 会将锁绑定到当前调用方法的对象上。
- 每个 StringBuffer 对象拥有独立的锁,不同实例之间互不影响
- 多个线程同时调用同一个 StringBuffer 实例的 synchronized 方法时,必须排队获取该实例的锁
- 锁的生命周期与方法执行一致:进入方法时自动加锁,退出(无论正常返回或抛异常)时自动释放
不是类锁,也不是字符串或其他对象
它不是类锁(即不是 StringBuffer.class),所以不会阻塞其他 StringBuffer 实例的操作;也不是内部字段(如 value 数组或 toStringCache)——锁目标明确且唯一:就是当前对象引用。
- 使用
new StringBuffer()创建的两个不同实例,它们的锁完全独立 - 即使内容相同、容量相同,只要不是同一个对象,就不会产生锁竞争
- 这也符合“最小粒度同步”原则,避免过度串行化
从字节码和 JVM 层面看
编译后,这些方法的字节码带有 ACC_SYNCHRONIZED 标志。JVM 在执行时,会通过对象头中的 Monitor 机制对 this 进行加锁,本质是调用 monitorenter 和 monitorexit 指令。
- 锁的实现依赖于对象头的 Mark Word,与具体业务逻辑无关
- toString() 等非修改方法未加 synchronized,可并发读取,不参与锁竞争
- 内部
toStringCache字段的更新由 synchronized 方法保障可见性,无需额外加锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











