面试题答案
一键面试1. StringBuilder非线程安全实现
- 关键方法:以
append
方法为例,StringBuilder
的append
方法没有任何线程同步相关的代码。
public StringBuilder append(String str) {
super.append(str);
return this;
}
这里直接调用父类AbstractStringBuilder
的append
方法进行字符串追加,没有对多线程并发访问做任何保护。这就意味着在多线程环境下,不同线程可能同时修改StringBuilder
内部的字符数组,导致数据不一致或其他错误。
- 性能影响:由于没有线程同步的开销,在单线程环境或者不需要考虑线程安全的多线程环境下,
StringBuilder
的性能较高。因为不需要等待锁的获取与释放,方法调用更加直接和高效。
2. StringBuffer线程安全实现
- 关键方法:同样以
append
方法为例,StringBuffer
的append
方法使用了synchronized
关键字修饰。
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
synchronized
关键字确保了同一时间只有一个线程能够进入该方法,从而保证了线程安全。在多线程环境下,当一个线程调用append
方法时,其他线程必须等待该线程释放锁后才能调用。
- 性能影响:由于
synchronized
带来的线程同步开销,在多线程环境下,如果竞争激烈,频繁的锁获取与释放会导致性能下降。相比StringBuilder
,在单线程环境下,StringBuffer
也会因为额外的同步操作而性能稍逊一筹。但在需要线程安全的多线程场景中,StringBuffer
能够保证数据的一致性和正确性。