我们知道StringBuffer是线程安全,而StringBuider则不是,在多线程的情况下。同样的条件可能导致得出的结果不同。
下面是测试代码:
package com.cbf4life; import java.util.ArrayList; import java.util.List; /** * Created by Maggie on 2017/6/6. */ public class StringBufferTest { StringBuilder sb=new StringBuilder(); StringBuffer sb1=new StringBuffer(); public StringBufferTest() { ThreadGroup group = new ThreadGroup("testGroup"); MyThread at=new MyThread(); for(int i=0;i<1000;i++){ Thread th=new Thread(group,at,String.valueOf(i)); th.start(); } while (group.activeCount() > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(sb.length()); System.out.println(sb1.length()); } public static void main(String[] args) { new StringBufferTest(); } class MyThread implements Runnable { public void run() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } sb.append("1"); sb1.append("1"); } } }
这段代码是模拟1000个线程,然后用StringBuffer和StringBuider添加字符串,测试将结果是StringBuffer添加的字符串
长度为1000,而StringBuider不是。原因是因为StringBuilder是非线程安全的,这就导致原本已经添加的字符串可能被后一个线程所替换。而源码当中StringBuffer的append方法是有synchronized关键字的,这就起到了排队效果,前一个线程添加完后,释放锁了,后一个线程才能添加。