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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘廖明 中级黑马   /  2013-4-26 14:29  /  1206 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

能够解释下:
(1)将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。这里面的不安全体现在那个地方?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
楼主你好,

肯定体现在线程的问题上,当多条语句同时访问StringBuilder肯定出现了线程安全问题,导致数据的错乱。
而StringBuffer的内部原理肯定都是加了相关同步的代码,所以在StringBuffer类里执行代码时,肯定有先来后到。
源码我就不给楼主找了。{:soso_e144:}

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
yim + 10 很给力!
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
/*
* 如果我们想,黑马程序员这五个字连在一起打印的话.
*                   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();
               
               
        }


}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
StringBuilder是线程不同步的,如果多线程运行的话,会导致数据错乱。但是StringBuilder运行速度会比StringBuffer效率高
回复 使用道具 举报
楼主可以看几段源码,这是StringBuffer的
public synchronized StringBuffer append(char[] str, int offset, int len) {
        super.append(str, offset, len);
        return this;
    }

    public synchronized StringBuffer append(boolean b) {
        super.append(b);
        return this;
    }

    public synchronized StringBuffer append(char c) {
        super.append(c);
        return this;
    }

    public synchronized StringBuffer append(int i) {
        super.append(i);
        return this;
    }
这个是StringBuilder的
public StringBuilder append(char[] str, int offset, int len) {
        super.append(str, offset, len);
        return this;
    }

    public StringBuilder append(boolean b) {
        super.append(b);
        return this;
    }

    public StringBuilder append(char c) {
        super.append(c);
        return this;
    }

    public StringBuilder append(int i) {
        super.append(i);
        return this;
    }

    public StringBuilder append(long lng) {
        super.append(lng);
        return this;
    }

由此可以看出,StringBuffer中的方法是加了锁的,所以是线程同步的,相比StringBuilder安全的同时,效率低。毕老师说最好用StringBuilder,因为效率高,多线程时可以自己加锁

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
不安全的体现说白了就是 数据添加时候可能会错乱。比如字符位置, 顺序等。
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-27 22:26:00
7#
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马