2020-4-8
最常被问到的面试题就是StringBuilder和StringBuffer的区别
大部分人都能回答出来StringBuilder不是线程安全的,StringBuffer则是线程安全的。但是StringBuilder为什么是非线程安全的呢?
我们不妨看一下源代码:
StringBuilder和StringBuffer都继承了AbstractStringBuilder类
StringBuffer的append()方法
@Override
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
StringBuffer的append()方法直接调用了父类的append方法,因为,StringBuffer的append方法有synchronized关键字,所以保证了线程安全。
StringBuilder的append()方法
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
较StringBuffer而言,StringBuilder的append方法舍弃了synchronized 关键字,我们再看一下 他们的父类 AbstractStringBuilder append方法的实现:
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
我们直接看这一句:
count += len;
试想多线程的情况下,比如有两个线程同时执行到了count += len;
这个语句。假定这个时候count为10,len为1;如果线程拿到的count都为10,那么这两个线程执行完这一条语句,count值就会变为11而不是12。所以,StringBuilder是线程不安全的。
网友评论