StringBuilder适用于单线程,StringBuffer适用于多线程共享实例;前者无同步开销、性能高,后者通过synchronized保证线程安全但性能较低。

直接看变量是否会被多个线程同时读写:单线程用 StringBuilder,多线程共享同一实例才用 StringBuffer。
关键区别就两点
• 线程安全:StringBuffer 所有 public 方法(如 append、insert)都加了 synchronized,能保证多个线程调用时不乱序、不越界;StringBuilder 完全没加锁,多线程共用会出错——比如拼出的 JSON 缺字段、日志串在一起、甚至抛 ArrayIndexOutOfBoundsException。
• 性能表现:因为没同步开销,StringBuilder 在单线程下普遍快 10%–15%,高频率拼接(如循环构建 SQL 或日志)差距更明显;StringBuffer 单线程下实测慢 2–3 倍,不只是“稍慢”,是锁获取、内存屏障和 JVM 优化限制共同导致的。
怎么判断该用哪个
• 同一个方法里创建、使用、丢弃(比如 Controller 中拼返回值、工具类里组装参数)→ 用 StringBuilder
• 对象被定义为 static 字段、Spring Bean 成员变量、或显式传给多个线程(如 executor.submit(() -> sb.append(...)))→ 必须用 StringBuffer
• 不确定会不会多线程?先用 StringBuilder;真出现并发问题,再换 StringBuffer 或改用 ThreadLocal<stringbuilder></stringbuilder>,别提前牺牲性能
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
一个容易忽略的优化点
• 创建时预估容量。默认初始容量是 16,每次扩容要复制数组(≈2×+2),开销不小。比如拼接 1000 条记录,每条约 50 字符,建议写 new StringBuilder(50000)。
• StringBuffer 同理,预设容量一样有效,但不能弥补同步带来的性能损失
立即学习“Java免费学习笔记(深入)”;
选对不是靠经验猜,而是盯住“谁在改”和“谁可能同时改”。String 不可变,适合常量;StringBuilder 是单线程拼接的事实标准;StringBuffer 只在真正无法避免共享可变状态时才用。

















