美文网首页
StringBuilder为什么线程不安全

StringBuilder为什么线程不安全

作者: 憨憨二师兄 | 来源:发表于2020-04-08 16:12 被阅读0次

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是线程不安全的。

相关文章

网友评论

      本文标题:StringBuilder为什么线程不安全

      本文链接:https://www.haomeiwen.com/subject/bnmtmhtx.html