多个线程操作StringBuffer和StringBuilder

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,还有多个 口

把代码中同步的注释去掉,两个结果就一样了

 

posted on 2015-10-02 21:51  T00YOUNG  阅读(1158)  评论(0编辑  收藏  举报