stringbuffer线程安全因其所有修改方法(如append、insert、delete)均被synchronized修饰,通过this锁确保同一时刻仅一个线程执行操作,保护内部char[]和count字段一致性,但性能低于stringbuilder。

StringBuffer 是线程安全的,适合多线程环境下的字符串拼接。 它通过在所有修改方法(如 append、insert、delete)上加 synchronized 锁来保证并发安全,但性能开销比非同步的 StringBuilder 更大。
为什么 StringBuffer 能在多线程中安全使用
它的关键设计是每个可能改变内部状态的方法都被声明为 synchronized,即同一时刻只允许一个线程执行这些操作。例如:
-
append(String)方法整体被锁住,多个线程调用时会排队执行; - 内部字符数组(
char[] value)的读写不会出现脏读、丢失更新等问题; - 扩容逻辑(如
ensureCapacity)也受同步保护,避免多个线程同时触发数组复制导致不一致。
典型多线程使用方式
常见做法是将 StringBuffer 实例作为共享对象供多个线程调用,无需额外同步控制:
- 多个线程共用同一个
StringBuffer对象,直接调用append(); - 适用于日志聚合、配置拼接、批量构建文本等场景;
- 注意:虽然操作安全,但最终结果的业务语义仍需由调用方保证(比如拼接顺序是否重要)。
与 StringBuilder 的对比选择
如果明确只在单线程中使用,优先选 StringBuilder——它功能相同但无同步开销,性能更好;
- 多线程且需要共享拼接结果 → 用
StringBuffer; - 多线程但每个线程各自拼接、不共享实例 → 单个线程内用
StringBuilder更高效; - 若对性能敏感且需更高并发能力,可考虑用
ThreadLocal<stringbuilder></stringbuilder>避免锁竞争。
实际编码注意事项
尽管线程安全,仍有一些细节影响正确性和效率:
- 不要在同步块外缓存或暴露内部数组(如调用
toString().toCharArray()后修改); - 避免在循环中频繁创建新
StringBuffer实例,复用更优; - 如果只是拼接固定数量字符串,用
String.join()或String.concat()可能更简洁; - 高并发下大量拼接,可评估是否改用
java.util.concurrent.ConcurrentLinkedQueue+ 合并策略,而非强依赖单一同步对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











