探究StringBuilder和StringBuffer的线程安全问题

一、StringBuffer 和 StringBuilder 是什么

它们都是 Java 中用于高效处理可变字符串的类,内部用字符数组存储数据,避免了 String 每次拼接都创建新对象的性能开销。

共同点:都继承自 AbstractStringBuilder,底层实现逻辑几乎一样,都支持 append()、insert()、delete() 等修改字符串的操作。

核心差异:StringBuffer 是线程安全的,StringBuilder 是非线程安全的。

二、为什么 StringBuffer 是线程安全的

1、StringBuffer 和 StringBuilder 的核心区别就在于线程安全性,而这正是由 synchronized 关键字决定的。

2、StringBuffer 的绝大多数公共方法(比如 append()、insert()、setLength()、trimToSize())都被 synchronized 关键字修饰了。

java 复制代码
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
​
@Override
public synchronized void setLength(int newLength) {
    toStringCache = null;
    super.setLength(newLength);
}

三、为什么 StringBuilder 是线程不安全的

1、StringBuilder 是 StringBuffer 的 "非线程安全" 版本,它的方法没有任何 synchronized 修饰。 2、在多线程同时调用 append() 时,会出现线程安全问题: 假设两个线程同时执行 append("a"),它们可能同时读取到当前长度,然后都尝试在该位置写入字符,导致其中一个字符被覆盖。 这种情况会导致最终的字符串内容与预期不符,甚至出现数组越界等异常。

讨论

1、所以若我们的代码是单线程的,可以使用 StringBuilder ,当代码是多线程时,就需要使用StringBuffer了。

2、如果只是少量固定字符串拼接,直接用 + 即可,编译器会自动优化为 StringBuilder

相关推荐
鲨鱼辣钊8 分钟前
【FastAPI筑基-Day19】APScheduler定时任务全实战|自动执行、动态启停、后台常驻
java·spring·fastapi
不正经学生2 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技2 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
恋恋西风4 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
学长毕业设计4 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
Brilliantwxx5 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
东小西5 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西5 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午5 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065255 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql