StringBuffer 的线程安全源于所有修改方法均为 synchronized,通过 this 锁保证单个方法调用的原子性,但不保证复合操作原子性;与 StringBuilder 的区别在于同步机制,适用于多线程共享同一实例的场景。

Java 中 StringBuffer 的多线程安全特性,是指它在多个线程**同时访问并修改同一个实例**时,能保证内部状态一致、不出现数据错乱或运行时异常。这种安全不是靠“不共享”或“每次都新建”,而是靠**方法级同步机制**——所有可能改变其内部状态的公共方法(如 append、insert、delete、reverse 等)都被声明为 public synchronized。
同步锁作用于整个对象实例
每个 synchronized 方法调用时,会自动获取该 StringBuffer 实例的 intrinsic lock(即 this 锁)。这意味着:
- 同一时刻,只有一个线程能执行该实例上的任意一个同步方法
- 其他线程若尝试调用同步方法,会被阻塞,直到当前线程释放锁
- 底层 char[] 数组(value)、长度计数器(count)等字段的读写操作,全部被锁保护,不会出现中间态被并发读取或覆盖
线程安全的边界是单个方法调用
StringBuffer 保证的是每个方法调用本身的原子性,但不保证多个方法组合操作的原子性。例如:
-
sb.length()和sb.append("x")是两个独立同步方法,中间可能被其他线程插入操作 - 若需“先判断再追加”这类逻辑(check-then-act),必须手动加锁:
synchronized(sb) { ... } - toString() 方法也是 synchronized,但它返回的是新 String 对象,后续对该 String 的操作不再受 StringBuffer 锁保护
与 StringBuilder 的本质区别
两者 API 完全一致,差异仅在于并发控制:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- StringBuffer:所有修改方法带 synchronized,适合多线程共享场景,语义明确、行为可预期
- StringBuilder:无任何同步机制,单线程下更快(快约 80%),但多线程共用会导致字符丢失、数组越界或内容乱序等未定义行为
- 误用 StringBuilder 替代 StringBuffer 不会编译报错,却可能引发偶发性、难以复现的错误
适用场景有明确前提
StringBuffer 的线程安全性只在以下情况真正发挥作用:
- 多个线程确实共用同一个 StringBuffer 实例(如静态日志缓冲区、跨线程传递的拼接容器)
- 这些线程会并发调用 append、insert 等修改方法
- 没有额外的外部同步逻辑干扰其内部锁机制(如反射修改内部字段会破坏安全性)
不复杂但容易忽略:线程安全 ≠ 业务逻辑安全,也不等于性能最优。选对工具的前提,是清楚自己是否真的需要“多线程共享可变字符串”。

















