StringBuffer是线程安全的,StringBuilder是线程不安全的
先上代码
1 public class Main { 2 StringBuffer sbuffer = new StringBuffer(); 3 StringBuilder sbuilder = new StringBuilder(); 4 5 public static void main(String[] args) { 6 Main main = new Main(); 7 Thread1 t1 = main.new Thread1(); 8 new Thread(t1).start(); 9 new Thread(t1).start(); 10 new Thread(t1).start(); 11 try { 12 Thread.sleep(3000); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 System.out.println(main.sbuffer.toString()); 17 System.out.println("buffer长度" + main.sbuffer.length()); 18 System.out.println(main.sbuilder.toString()); 19 System.out.println("builder长度"+main.sbuilder.length()); 20 } 21 22 class Thread1 implements Runnable{ 23 24 public void run(){ 25 for(int i=0; i<500; i++){ 26 sbuffer.append(""+i%10); 27 //下面是同步块,加上同步块之后上面的StringBuffer输出和StringBuilder输出是一样的 28 // synchronized (sbuilder) { 29 sbuilder.append(""+i%10); 30 // } 31 } 32 } 33 } 34 }
我开了三个线程执行,再sleep 3秒钟,应该3个线程都执行完了,再输出两个结果
结果如下
多试几次,每次结果不一样,偶尔builder也会是1500个长度,大部分长度小于1500,还有多个 口
把代码中同步的注释去掉,两个结果就一样了