多个线程操作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,还有多个 口

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

 

转载于:https://www.cnblogs.com/zlzlzl/p/4852784.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值