为什么StringBuilder线程不安全?

StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final修饰的,是不可变的,而StringBuilder和StringBuffer的char数组是可变的。

//存储字符串的具体内容
char[] value;
//已经使用的字符数组的数量
int count;

假设我开启多个线程分别调用 StringBuffer 和 StringBuilde r的 append()方法,会发现 StringBuilder 的length总是比预期的更小,而 StringBuffer 与预期是一致的。通过查看 append()源码可以发现,StringBuffer的append()前加了 synchronized,再进一步看,发现 StringBuffer 和StringBuilder 都是调用父类(AbstractStringBuilder类)的append(),从这里有一行 count += len。

如果两个线程同时访问到这个方法,那么AbstractStringBuilder中的count就是相同的,所以这两个线程都是在底层 char 数组的 count 位置开始append添加,那么最终的结果肯定就是在后执行的那个线程append进去的数据会将前面一个覆盖掉,count因此比预期的小。
然而StringBuffer却不会发生这种情况,因为StringBuffer的append()是Synchronized关键字,是线程安全的。

StringBuilder相比StringBuffer效率更高,但多线程不安全,在单线程中字符串的频繁拼接使用StringBuilder效率更高,对于多线程使用StringBuffer则更安全,字符串简单操作时没必要使用上述两者,还是用String类型提高速度。
为什么StringBuilder线程不安全?

发布了109 篇原创文章 · 获赞 2 · 访问量 2898

猜你喜欢

转载自blog.csdn.net/baidu_41592938/article/details/104687831