面试的时候总能遇到 StringBuilder 与 StringBuffer 的区别是什么,标准答案总是:
- StringBuilder 是线程不安全的,StringBuffer 是线程安全的。
- 因为 StringBuffer 是用 synchronized 同步锁实现线程安全,相对 StringBuilder 来说性能稍弱一些。
我在通过以下代码来实践的时候发现:StringBuffer 在多线程同步写入的时候也会发生信息丢失。
下面代码通过分别对 StringBuilder 和 StringBuffer 起十个线程进行同步写入操作,每个线程均使用 append 方法添加 1000 个字符。使用 StringBuilder 的期望结果是最终字符长度小于等于 10000,而 StringBuffer 的结果总是 10000。但是我在实验的结果中发现使用 StringBuffer 的结果中也有小于 10000 的情况。
想不明白是为什么?麻烦老师帮忙解答一下,谢谢。
public class ImoocTest {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 10; i++) {
new ATest(builder, buffer).start();
}
}
}
class ATest extends Thread {
private StringBuilder builder;
private StringBuffer buffer;
ATest(StringBuilder builder, StringBuffer buffer) {
this.buffer = buffer;
this.builder = builder;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
builder.append("c");
buffer.append("c");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("[" + Thread.currentThread().getName() + "]builder:" + builder.length());
System.out.println("[" + Thread.currentThread().getName() + "]buffer:" + buffer.length());
}
}