理解StringBuffer与StringBuilder的线程安全区别

理解StringBuffer与StringBuilder的线程安全区别

众说周知,StringBuffer是线程安全的,StringBuilder是线程不安全的。
我刚开始虽然知道概念,但是问到如何根据应用场景选择不同的就懵逼了。这就是知其然不知其所以然。

先看一下StringBuilder内部的append()方法的具体实现,发现是先读后写。大概过程:

1.读取当前字符串长度。
2.对容量进行判断,如果不够存储追加的字符串则扩容。
3.根据当前字符串长度值,在后面追加新字符串。

先设定应用场景:线程A和B同时对全局变量StringBuilder builder进行追加操作。


情况1:线程不安全导致程序异常

假设线程A的追加操作在(读取当前长度之后,判断是否扩容之前)这一刻,线程B完成了追加操作。

这时线程A以为容量足够而没有扩容(实际上线程B的追加已经导致容量不足),就直接追加,结果就是抛出了数组越界异常。

情况2:虽无程序异常,但结果错误

builder的值为"abc"。

假设线程A执行追加操作append("d")的这一刻(读取当前长度之后和判断是否扩容之后,追加新字符串之前),线程B完成了追加操作append("e")。

这时线程A已经读取的字符串长度会使其判断成需要把"d"追加在"abc"之后,结果就是覆盖了线程B追加内容,builder的值为"abcd"。

再看一下StringBuffer,与StringBuilder不同的是使用了synchronized修饰append方法。

作用是线程A在调用appeend方法时,线程B无法调用append方法(此时线程B被阻塞)
保证了线程A能够在判断扩容和追加时读取到正确的长度,从而避免数组越界异常或结果错误。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值