StringBuilder 与 StringBuffer 的问题

来源:6-5 谈谈ClassLoader

赶快肥家

2018-12-28

面试的时候总能遇到 StringBuilder 与 StringBuffer 的区别是什么,标准答案总是:

  1. StringBuilder 是线程不安全的,StringBuffer 是线程安全的。
  2. 因为 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());
	}
}
写回答

2回答

赶快肥家

提问者

2018-12-29

运行结果截图:

//img.mukewang.com/szimg/5c27981a00010d0310170790.jpg

0
0

翔仔

2018-12-29

同学好,如果你发现buffer不是10000的请提供下截图,我这边执行N次都是10000,因为buffer是线程安全的,理论上不会出现不是10000的结果。。

0
5
赶快肥家
回复
翔仔
好的,谢谢老师。
2018-12-30
共5条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8426 学习 · 1870 问题

查看课程