黑马程序员技术交流社区

标题: StringBuffer和StringBuilder的多线程体现在哪里 [打印本页]

作者: breeze    时间: 2013-4-23 00:23
标题: StringBuffer和StringBuilder的多线程体现在哪里
本帖最后由 breeze 于 2013-4-28 20:42 编辑

StringBuffer是线程安全的, StringBuilder是线程不安全的, 但是怎样用代码能体现出来它们两个的线程安全问题, 求一段代码比较这两个类的线程安全问题
作者: 黑马-张明    时间: 2013-4-23 00:50
本帖最后由 黑马-张明 于 2013-4-23 01:16 编辑

StringBuffer和StringBuilder的线程安全比较代码:
  1. 01 import java.util.Random;
  2. 02
  3. 03 public class StringBufferVsStringBuilder {
  4. 04     public static int demo(final Object stringJoiner, final int testCount) throws InterruptedException {
  5. 10                 try {
  6. 11                     Thread.sleep(rand.nextInt(2));
  7. 12                 } catch (InterruptedException e) {
  8. 13                     return;
  9. 14                 }
  10. 20             }
  11. 21         };
  12. 22         
  13. 23         for (int i = 0; i < testCount; i++) {
  14. 24             new Thread(group, listAppender, "InsertList-" + i).start();
  15. 30         
  16. 31         return stringJoiner.toString().length();
  17. 32     }
  18. 33     
  19. 34     public static void main(String[] args) throws InterruptedException {
  20. 40             stringBuffer.delete(0, stringBuffer.length());
  21. 41             int builderLength = demo(stringBuilder, N);
  22. 42             int bufferLength = demo(stringBuffer, N);
  23. 43             System.out.println("StringBuilder/StringBuffer: " + builderLength + "/" + bufferLength);
  24. 44         }
  25. 45     }
  26. 46 }
复制代码

作者: breeze    时间: 2013-4-23 21:24
黑马-张明 发表于 2013-4-23 00:50
StringBuffer和StringBuilder的线程安全比较代码:

貌似上面给这段代码运行不了啊, 能给点注释吗
作者: 付鑫鑫    时间: 2013-4-27 16:58
/*
* 如果我们想,黑马程序员,java,连在一起打印的话.
* 用StringBuilder就有可能不会连着打印出来.
* 用StringBuffer可以同步,就一直都会连在一起打印出来
*
* 一般,都不用StringBuffer这个类,因为效率低,除非同步的时候.
* 如果要同步的话,就用StringBuffer为好,
*
*/

public class Demo05 {
        public static void main(String[] args) {
                new Thread(){
                        public void run() {
                                for (int i = 0; i < 10000; i++) {                                                                       
                                        StringBuilder s = new StringBuilder();                                        //        用StringBuilder打印的话,        黑马程序员和java会交错打印,可以试试,呵呵       
                                        System.out.print(s.append("黑"));
                                        System.out.print(s.append("马"));
                                        System.out.print(s.append("程"));
                                        System.out.print(s.append("序"));
                                        System.out.print(s.append("员"));
                                        System.out.println("\r\n");
                                       
                                }
                        }
                }.start();
               
                new Thread(){
                        public void run() {
                               
                                StringBuilder s = new StringBuilder();
                                for (int i = 0; i <10000; i++) {
                                        System.out.println(s.append("j"));
                                        System.out.println(s.append("a"));
                                        System.out.println(s.append("v"));
                                        System.out.println(s.append("a"));
                                        System.out.println("\r\n");
                                }
                        }
                }.start();
               
               
        }


}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2