简短结论:StringBuilder 本身不是线程安全的,但在“局部变量、不逃逸出线程”的场景下,实际可以安全使用。
下面详细说一下:
StringBuilder 的方法(如 append、insert、delete 等)没有加锁,也没有做同步控制。
如果在多个线程同时操作同一个 StringBuilder 实例,可能出现:
ArrayIndexOutOfBoundsException示例(不安全):
StringBuilder sb = new StringBuilder();
// 多线程同时执行
sb.append("a");
sb.append("b");
✅ 作为方法内的局部变量使用
public String buildMessage() {
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append("world");
return sb.toString();
}
原因:
✅ 不把 StringBuilder 暴露给其他线程
StringBufferStringBuffer sb = new StringBuffer();
sb.append("a");
synchronizedStringBuilder + 线程私有StringBuilder sb = new StringBuilder(); // 每个线程一份
List<String> list = ...;
String result = list.parallelStream()
.map(s -> new StringBuilder(s).reverse().toString())
.collect(Collectors.joining());
String result = IntStream.range(0, 10)
.parallel()
.mapToObj(i -> "num" + i)
.collect(Collectors.joining());
| 类 | 线程安全 | 性能 | 使用建议 |
|---|---|---|---|
| StringBuilder | ❌ 否 | ✅ 高 | 单线程 / 局部变量 |
| StringBuffer | ✅ 是 | ❌ 低 | 老代码 / 简单共享 |
| 不可变 String | ✅ 是 | 中 | 拼接少 |
| Stream / joining | ✅ 是 | ✅ 高 | 现代写法 |
StringBuilder 不是线程安全的,但只要“不共享”,它就是安全的。
如果你愿意,可以告诉我你的具体使用场景(比如日志、接口返回、并发计算),我可以帮你选最合适的方式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。