StringBuffer、Stringbuilder线程安全之源码分析

想必大家都知道StringBuffer 为线程安全类,StringBuilder为非线程安全,但是 是否有过究其原因呢?

StringBuffer


StringBuilder

借助工具可以很简单的找到JDK中StringBuffer、StringBuilder类的源码实现,我们可以看到在我们常用的append()方法中,StringBuffer做了synchronized处理,而StringBuilder并未做synchronized处理,至此我们大致找到了StringBuffer线程安全的原因。但是super.append(str)方法为什么需要加synchronized才可以保证线程安全呢?我们再来接着看下super.append(str)的实现。


AbstractStringBuilder

AbstractStringBuilder类是一个abstract类,StringBuffer和StringBuilder均为AbstractStringBuilder类实现,在此实现中我们可以看到方法中执行两个步骤,第一步对追加后的字符串进行长度预判断,此时并未将参数str添加到原对象中,(如果现存的value[]长度不满足追加后的长度,则以追加后的字符串长度进行newCapacity)第二步调用String类中的getChars()方法(如下图),将字符真正添加到原字符串对象中去。


String.getChars

至此我们了解到由于AbstractStringBuilder.append()方法并非原子性的操作,所以StringBuilder在多线程环境未加synchronized的情况下出现数组越界异常、结果数据不正确等非预期的问题发生。而由于StringBuffer.append()方法 采用了synchronized进行同步,所以可以在多线程环境中保证线程安全。

你可能感兴趣的:(StringBuffer、Stringbuilder线程安全之源码分析)