探究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。

相关推荐
特立独行的猫A11 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
大可不必了16 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus16 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道17 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛17 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
budingxiaomoli18 小时前
Spring统一功能处理
java·后端·spring
eggwyw18 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
Flynn Liang19 小时前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
金銀銅鐵20 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++