A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 breeze 于 2013-4-28 20:42 编辑

StringBuffer是线程安全的, StringBuilder是线程不安全的, 但是怎样用代码能体现出来它们两个的线程安全问题, 求一段代码比较这两个类的线程安全问题

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 新人鼓励

查看全部评分

3 个回复

倒序浏览
本帖最后由 黑马-张明 于 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 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 注意添加适当的注释

查看全部评分

回复 使用道具 举报
黑马-张明 发表于 2013-4-23 00:50
StringBuffer和StringBuilder的线程安全比较代码:

貌似上面给这段代码运行不了啊, 能给点注释吗
回复 使用道具 举报
/*
* 如果我们想,黑马程序员,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();
               
               
        }


}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马