黑马程序员技术交流社区

标题: 关于容器的问题? [打印本页]

作者: 潘廖明    时间: 2013-4-26 14:29
标题: 关于容器的问题?
能够解释下:
(1)将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。这里面的不安全体现在那个地方?

作者: 袁梦希    时间: 2013-4-26 14:48
楼主你好,

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

作者: 付鑫鑫    时间: 2013-4-27 16:20
/*
* 如果我们想,黑马程序员这五个字连在一起打印的话.
*                   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();
               
               
        }


}
作者: 蔚蓝小嗨    时间: 2013-4-27 20:52
StringBuilder是线程不同步的,如果多线程运行的话,会导致数据错乱。但是StringBuilder运行速度会比StringBuffer效率高
作者: 403383221    时间: 2013-4-27 21:12
楼主可以看几段源码,这是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,因为效率高,多线程时可以自己加锁
作者: 黑马-秦歌    时间: 2013-4-27 21:16
不安全的体现说白了就是 数据添加时候可能会错乱。比如字符位置, 顺序等。
作者: 黄玉昆    时间: 2013-4-27 22:26
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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