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

相关推荐
yaoxin5211231 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫1 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的2 小时前
C++纯虚函数
开发语言·c++·网络安全
何极光2 小时前
IDEA集成Maven
java·maven·intellij-idea
程序员二叉2 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉2 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.02 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木2 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
凡人叶枫3 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员3 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言