stringbuffer是线程安全的,因其所有公共方法均用synchronized修饰,通过this锁保证互斥访问;多线程中可直接共享使用,无需额外同步,但需避免未完成拼接就暴露tostring()结果。

StringBuffer 本身就是线程安全的,多线程下直接用即可,无需额外同步。
为什么 StringBuffer 是线程安全的
StringBuffer 的所有公共方法(如 append()、insert()、delete()、toString())都加了 synchronized 关键字,保证同一时刻只有一个线程能执行这些操作。底层通过对象锁(this)实现互斥访问,避免了数据错乱或并发修改异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
多线程中正确使用 StringBuffer 的方式
- 每个线程不要共享同一个 StringBuffer 实例 —— 这样虽安全但会严重串行化,失去并发意义;
- 推荐为每个线程分配独立的 StringBuffer 实例,在线程内拼接完成后,再汇总结果(如通过 ConcurrentHashMap 或 synchronized 块合并);
- 若必须共享一个 StringBuffer(比如作为全局日志缓冲区),可放心调用 append() 等方法,无需再套 synchronized;
- 注意:StringBuffer 不是不可变对象,共享时要避免在未完成拼接前就调用 toString() 并暴露引用,以防其他线程继续修改影响结果一致性。
对比 StringBuilder 和 StringBuffer
StringBuilder 方法没加 synchronized,性能更高,但不适用于多线程直接共享场景;StringBuffer 虽慢一点(约 10%~20% 开销),但省去了手动加锁的复杂性和出错风险。如果确定只在一个线程里用,优先选 StringBuilder;跨线程协作且需共用缓冲区时,StringBuffer 是更稳妥的选择。
简单示例:多个线程向同一个 StringBuffer 写入
(仅用于演示线程安全性,实际中更推荐分线程拼接后合并)
StringBuffer sb = new StringBuffer();
List<thread> threads = new ArrayList();
for (int i = 0; i sb.append("Thread-").append(Thread.currentThread().getId()).append("; ")));
}
threads.forEach(Thread::start);
threads.forEach(t -> {
try { t.join(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
});
System.out.println(sb.toString()); // 输出顺序不定,但内容不会损坏、不会抛 ConcurrentModificationException
</thread>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










