stringbuffer 是线程安全的,因其所有公开修改方法(如 append、insert、delete、reverse)均用 synchronized 修饰,锁对象为实例本身,确保多线程调用时串行执行、状态一致;但仅保障单方法原子性,多步组合操作仍需手动同步,且必须共享同一实例才有效。

StringBuffer 是线程安全的,直接用就行,不需要额外加锁。
为什么 StringBuffer 能安全用于多线程?
StringBuffer 的所有公开方法(如 append、insert、delete、reverse)都用了 synchronized 关键字修饰,内部操作是原子的。多个线程同时调用同一个 StringBuffer 实例的方法,不会出现数据错乱或抛出异常。
怎么正确使用 StringBuffer 多线程拼接?
注意两点:一是共享实例要确保是同一个对象;二是避免在同步块外修改其状态(比如用反射或绕过 API 直接操作内部数组)。常规用法如下:
- 创建一个共享的 StringBuffer 实例(例如作为类字段或通过依赖注入)
- 多个线程调用它的 append() 方法追加内容
- 全部写完后,主线程调用 toString() 获取最终字符串
和 StringBuilder 的关键区别
StringBuilder 没有同步机制,性能更高,但不适用于多线程共享场景;StringBuffer 明确设计为线程安全,适合并发拼接。如果只是单线程或每个线程用独立实例,优先选 StringBuilder;若多个线程共写一个缓冲区,就用 StringBuffer。
实际例子:多个线程协作构建日志内容
比如启动 3 个线程,各自往同一个 StringBuffer 中写入一行日志:
- 线程 A 执行 sb.append("[INFO] task1 done")
- 线程 B 执行 sb.append("[WARN] retrying...")
- 线程 C 执行 sb.append("[ERROR] timeout")
- 最终结果顺序不确定,但内容不会损坏、不会抛 ArrayIndexOutOfBoundsException 等异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











