stringbuffer 的所有修改方法默认线程安全,通过在每个 public 方法上加 synchronized 关键字实现,锁对象为 this,保证同一实例的修改操作串行执行;但复合操作仍需外部同步。

Java 中 StringBuffer 的所有修改方法(如 append、insert、delete、replace、reverse 等)默认就是线程安全的,其线程安全性正是通过在每个公共修改方法上加 synchronized 关键字实现的。
具体来说,StringBuffer 是 AbstractStringBuilder 的子类,而它的所有可变操作方法都声明为 synchronized,即每个方法在执行时会获取当前 StringBuffer 实例的对象锁(this 锁),从而保证同一时刻只有一个线程能执行该实例上的修改操作。
以下是关键点说明:
所有修改方法都加了 synchronized
这些方法包括但不限于:
-
append(...)(多个重载版本) insert(int offset, ...)delete(int start, int end)deleteCharAt(int index)replace(int start, int end, String str)reverse()setCharAt(int index, char ch)setLength(int newLength)
每个方法签名前都有 synchronized 修饰符,例如(简化示意):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
✅ 注意:
toString()方法也加了synchronized(因为可能触发内部缓存更新),但它是读操作,不改变内容。
加锁粒度是 this 对象锁
- 每个
StringBuffer实例拥有独立的锁。 - 线程 A 调用
sb1.append(...)和线程 B 调用sb2.append(...)互不影响(不同实例,不同锁)。 - 但线程 A 和线程 B 同时调用
sb1.append(...)会被串行化。
不是“手动加锁”,而是语言级同步机制
你不需要也不应该在调用时再额外加 synchronized(sb) —— 那样是冗余且可能引发死锁或性能问题。StringBuffer 的设计已内置同步,直接调用即可。
对比 StringBuilder
-
StringBuilder是StringBuffer的非线程安全版,所有方法都没有synchronized。 - 如果你在单线程场景下使用,优先选
StringBuilder(性能更好); - 多线程共享同一个缓冲区且需安全修改时,才用
StringBuffer。
小提醒:同步不能解决所有并发问题
synchronized 保证单个方法原子性,但复合操作仍需外部同步。例如:
if (sb.length() <p>这段代码即使用 <code>StringBuffer</code>,依然存在竞态条件(race condition)。正确写法应加外部同步:</p><pre class="brush:java;toolbar:false;">synchronized (sb) {
if (sb.length() <p>不复杂但容易忽略。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










