如何理解StringBuilder

JAVA常用API (应用程序编程接口)

java.long.String(StringBuilder线程不安全,StringBuffer线程安全)

分析

其中StringBuilder和StringBuffer同String一样都是由char数组来存储字符串的;不同的是String 是final修饰的是不可变的,而StringBuilder和StringBuffer的char数组是可变的。

现在让我们来看看StringBuilder,为什么说它是线程不安全呢?

原因在于StringBuffer在append()方法上使用了synchronized,而StringBuilder没有使用。
StringBuilder一般在单线程操作字符串缓冲区下操作大量数据 。

StringBuilder在多线程操作中会出现什么样的问题呢?
以下面这段代码为例:

package itheima;

public class StringBuilderDemo {
    public static void main(String[] args) throws InterruptedException {
        StringBuilder stringBuilder = new StringBuilder();//创建StringBuilder对象
        for (int i = 0; i < 10; i++){
            new Thread(new Runnable() {//新建线程
                public void run() {//调用线程
                    for (int j = 0; j < 10000; j++){//将每个线程循环10000次
                        stringBuilder.append("abc");
                    }
                }
            }).start();//线程启动
        }

        Thread.sleep(100);//让当前线程休眠100毫秒
        System.out.println(stringBuilder.length());//
    }

}

以上这段代码创建了10个线程,每个线程循环10000次往StringBuilder对象里面append"abc"字符。在正常情况下运行这段代码应该输出300000。

下面来看看我们运行的结果:
在这里插入图片描述
上面我们分析了正常的输出应该是300000,而我们的结果是273459,运行结果可以表明StringBuilder不适合多线程的操作,不能安全使用多线程。 如果需要同步,那么还是建议使用StringBuffer 。
除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛NullPointerException。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值