MST

星途 面试题库

面试题:Java中StringBuilder非线程安全与StringBuffer线程安全的实现差异

详细阐述StringBuilder非线程安全和StringBuffer线程安全是如何通过代码实现的,包括它们在关键方法上的不同之处以及对性能的影响。
37.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. StringBuilder非线程安全实现

  • 关键方法:以append方法为例,StringBuilderappend方法没有任何线程同步相关的代码。
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

这里直接调用父类AbstractStringBuilderappend方法进行字符串追加,没有对多线程并发访问做任何保护。这就意味着在多线程环境下,不同线程可能同时修改StringBuilder内部的字符数组,导致数据不一致或其他错误。

  • 性能影响:由于没有线程同步的开销,在单线程环境或者不需要考虑线程安全的多线程环境下,StringBuilder的性能较高。因为不需要等待锁的获取与释放,方法调用更加直接和高效。

2. StringBuffer线程安全实现

  • 关键方法:同样以append方法为例,StringBufferappend方法使用了synchronized关键字修饰。
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

synchronized关键字确保了同一时间只有一个线程能够进入该方法,从而保证了线程安全。在多线程环境下,当一个线程调用append方法时,其他线程必须等待该线程释放锁后才能调用。

  • 性能影响:由于synchronized带来的线程同步开销,在多线程环境下,如果竞争激烈,频繁的锁获取与释放会导致性能下降。相比StringBuilder,在单线程环境下,StringBuffer也会因为额外的同步操作而性能稍逊一筹。但在需要线程安全的多线程场景中,StringBuffer能够保证数据的一致性和正确性。