请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

StringBuilder 与 StringBuffer 的问题

面试的时候总能遇到 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());
	}
}

正在回答 回答被采纳积分+3

2回答

提问者 赶快肥家 2018-12-29 23:51:39

运行结果截图:

//img1.sycdn.imooc.com//szimg/5c27981a00010d0310170790.jpg

0 回复 有任何疑惑可以回复我~
翔仔 2018-12-29 23:02:26

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

0 回复 有任何疑惑可以回复我~
  • 提问者 赶快肥家 #1
    老师好,图片上传到新的回答下面了。
    回复 有任何疑惑可以回复我~ 2018-12-29 23:52:43
  • 翔仔 回复 提问者 赶快肥家 #2
    同学好,仔细看了下你的写的程序是不是有点问题,程序逻辑里,你的线程并不是等待所有线程都执行完成了才打印buffer的总数,也就是有部分线程如果执行完成了,那么就会先输出结果了,此时的buffer并不是等于10000,因为10条线程还没执行完成呢,也没办法保证已经执行完成了
    回复 有任何疑惑可以回复我~ 2018-12-30 00:14:27
  • 提问者 赶快肥家 回复 翔仔 #3
    老师好,看来我对多线程掌握的还是不好。那么如何修改代码才能使得10条线程都执行完毕后才打印结果呢?
    回复 有任何疑惑可以回复我~ 2018-12-30 00:32:10
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信