stringbuilder非线程安全,stringbuffer线程安全;前者无同步机制、性能更高,后者方法均加synchronized、适用于多线程;二者api一致但设计目标不同。

StringBuilder 是非线程安全的,StringBuffer 是线程安全的 —— 这是两者最本质、最直接的区别。
线程安全的实现方式不同
StringBuffer 的每个公共方法(如 append、insert、reverse)都加了 synchronized 关键字,意味着同一时刻只有一个线程能执行该方法。这种粗粒度同步能防止多线程并发修改导致的数据错乱。
StringBuilder 完全没有同步机制,所有方法都是普通实例方法。它不处理任何锁竞争,也不检查线程上下文,因此在多线程共享同一个实例时,可能出现字符数组越界、长度计数错误、内容覆盖等不可预测行为。
性能表现差异明显
同步带来开销:即使在单线程中调用 StringBuffer,JVM 仍需完成锁的获取与释放流程(包括偏向锁尝试、轻量级锁膨胀等)。而 StringBuilder 避开了全部锁逻辑,方法调用更轻量。
- 在纯单线程字符串拼接场景下,StringBuilder 通常比 StringBuffer 快 5–15 倍
- 这种差距不是来自算法或扩容策略(二者底层都继承 AbstractStringBuilder,初始容量同为 16,扩容公式均为 old * 2 + 2),而是源于是否承担同步成本
适用场景不能混用
选错类可能导致程序在压力测试或上线后暴露隐蔽问题:
- 多个线程共用一个可变字符串对象 → 必须用 StringBuffer
- 局部变量、方法内临时拼接、Stream 中的 map 操作 → 用 StringBuilder 更合适
- 若误将 StringBuilder 用于静态字段或 Spring Bean 中被多线程注入的成员变量,极易引发数据污染
它们不是“功能子集”关系
虽然 API 几乎完全一致(都提供 append、delete、replace、capacity 等方法),但线程安全性不是可开关的选项,而是类契约的一部分。StringBuffer 不是“加强版 StringBuilder”,StringBuilder 也不是“阉割版 StringBuffer”。它们是为不同并发模型设计的独立工具。
从 JDK 1.0 就存在的 StringBuffer,到 JDK 5 引入 StringBuilder,目的就是明确分离关注点:一个保安全,一个求效率。










