StringBuilder是线程不安全的类。
StringBuffer是线程安全的,因为它里面的方法加了同步。
今天写了一段代码测试了一下:用循环开启10个线程,调用StringBuffer (StringBuilder)的追加追加1到10。
结果预期一样:线程不安全的StringBuilder会漏掉一些数字,
公共静态void main (String [] args)抛出InterruptedException { StringBuffer缓冲=new StringBuffer (); StringBuilder builder=new StringBuilder ();//开启十个线程,分别对缓冲区和建设者操作 for (int i=0;我& lt;10;我+ +){ int j=我; 新线程(新Runnable () { 公共空间run () { 尝试{ thread . sleep (500);//造成阻塞 }捕捉(InterruptedException e) { e.printStackTrace (); } builder.append (j); } }) .start (); }//等待以上操作完成 thread . sleep (1000);//打印结果 System.out.println(“构建器:“+ builder); }
线程安全的StringBuffer则追加了全部10个数字:
公共静态void main (String [] args)抛出InterruptedException { StringBuffer缓冲=new StringBuffer (); StringBuilder builder=new StringBuilder ();//开启十个线程,分别对缓冲区和建设者操作 for (int i=0;我& lt;10;我+ +){ int j=我; 新线程(新Runnable () { 公共空间run () { 尝试{ thread . sleep (500);//造成阻塞 }捕捉(InterruptedException e) { e.printStackTrace (); } buffer.append (j); } }) .start (); }//等待以上操作完成 thread . sleep (1000);//打印结果 System.out.println(“缓冲:“+缓冲); }
<强> 强>
公共静态void main (String [] args)抛出InterruptedException { StringBuffer缓冲=new StringBuffer (); StringBuilder builder=new StringBuilder ();//开启十个线程,分别对缓冲区和建设者操作 for (int i=0;我& lt;10;我+ +){ int j=我; 新线程(新Runnable () { 公共空间run () { 尝试{ thread . sleep (500);//造成阻塞 }捕捉(InterruptedException e) { e.printStackTrace (); } buffer.append (j); builder.append (j); } }) .start (); }//等待以上操作完成 thread . sleep (1000);//打印结果 System.out.println(“缓冲:“+缓冲); System.out.println(“构建器:“+ builder); }
以上这篇浅谈同步的方法对非同步的方法的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。