目录

  • 前言与问题
  • 分析与验证
    • StringBuffer测试
  • 结论

前言与问题

因为今天又看到有人拿StringBuffer和StringBuidler当面试题说了,这也是挺无聊的一个问题,被大家当成一个问题,说明很多人觉得他们俩的应用场景不同?

我脑海中出现了一个想法:其实StringBuffer没用使用场景

其实网上也有人提出了问题,说“StringBuffer不是线程安全的,所以它没用
我也提一个问题:就算StringBuffer是线程安全的,它也没用

分析与验证

看源码

StringBuffer基本上只是每个方法都比StringBuilder多了synchronized修饰,他们都继承了AbstractStringBuilder,方法也基本相同

但是想一下多线程并发访问同一StringBuffer/StringBuilder的情况下,会出现什么结果:

StringBuffer测试

因为synchronized标记了append,所以同一时间,只有一个线程能访问本对象,

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class Test {/*** 主角*/StringBuffer sb = new StringBuffer();/*** 保证全部所有线程append完后再打印*/CyclicBarrier cb = new CyclicBarrier(100, () -> System.out.println(sb.toString()));/*** 启动** @param args*/public static void main(String[] args) {Test t = new Test();for (int i = 0; i < 100; i++) {t.appendThread(i + " ").start();}}/*** 线程中封装append操作** @param s* @return*/private Thread appendThread(String s) {return new Thread(() -> {sb.append(s);try {cb.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}});}
}

部分结果如下,拼接的顺序是乱了的

这可有点问题了,如果这是发一段聊天的话,字打错了很麻烦的
例如把 “妈妈和爸爸在家正玩得开心,隔壁王叔叔来电话了”
拼成 “妈妈和王叔叔在隔壁正玩得开心,家里爸爸来电话了”
那就麻烦了

结论

这样的并发安全有什么用呢,我们在单线程中用StringBuilder挺快的,免去使用synchronized(虽然单线程中是轻量级锁,或者jvm直接锁消除了),何必并发拼接字符串呢,还得保证时序性。

StringBuffer是线程安全的,但是它还是没用。

StringBuilder并不是StringBuffer的兄弟,而是来取代StringBuffer的。

“没用”的StringBuffer,StringBuffer被StringBuilder取代的原因相关推荐

  1. String、StringBuffer、与StringBuilder的区别

    原文:http://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html String.StringB ...

  2. Java String,StringBuilder和StringBuffer的区别 StringBuilder StringBuffer String

    可以证明,字符串操作是计算机程序设计中最常见的行为. String:不可变的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原St ...

  3. java.lang包—StringBuffer类和StringBuilder类

    目录 一.数据结构 二.线程安全性分析 三.源码 四.适用场景 一.数据结构 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串.String 类是不可变类,即一旦一 ...

  4. 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类

    第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...

  5. StringBuffer类和StringBuilder类

    1.StringBuffer 类基本介绍 java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删. 很多方法与String相同,但StringBuffer是可变长度的 ...

  6. String类、StringBuffer类与StringBuilder类

    一.三者的区别         [Java中的String,StringBuilder,StringBuffer三者的区别 - 酥风 - 博客园] String 类 :不可变字符序列 StringBu ...

  7. String,StringBuffer,StringBuffer的区别

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的地位不言而喻,那 ...

  8. 常用API-1(Object类、String类、StringBuffer类、StringBuilder类)

    1. Object类 Java语言的根类,即所有类的父类. 1.1 clone() 返回一个Object对象的复制.这个复制返回的是一个新对象. clone() 是 Object 的 protecte ...

  9. String类、StringBuffer类、StringBuilder类的区别

    String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼 ...

最新文章

  1. ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题
  2. Java finally
  3. azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?
  4. pythonmatplotlib刷新_matplotlib:如何刷新figure.canvas
  5. 解决eclipse/myeclipse导入项目时出现红色叹号的方法
  6. PHP学习笔记四(超级全局变量 和 魔术常量)
  7. SQL Server 2016下载及安装教程
  8. 中日交流日本语初级上
  9. 谷歌云计算技术基础架构,谷歌人工智能算法框架
  10. 蜗牛学院:中国人,努力获得了荣誉却要压抑克制
  11. jQuery的页面加载完毕事件?
  12. 程序员去大公司面试,阿里P8面试官都说太详细了,社招面试心得
  13. 金钱找零问题,招行笔试题
  14. 如何使用github?
  15. 使用python连接clickhouse并发送邮件
  16. 28所示范性微电子院校占地面积排名,中山大学第一!
  17. Activiti工作流使用之SpringBoot整合Activiti
  18. 机器阅读理解技术初探Bi-DAF
  19. 观《华尔街:金钱永不眠》有感
  20. 惆怅长岑长惆怅长岑长惆怅长岑长吃吃吃

热门文章

  1. 如何做Unity手游性能优化的
  2. QTcpServer 服务器监听失败
  3. maven install失败的问题
  4. 如何将图片识别为可编辑的Word文件
  5. 虚拟化、虚拟机等概念理解
  6. Try-with-resources are not supported at language level ‘5‘ 报错
  7. MountVolume.NewMounter initialization failed for volume “pvc-61dedc85-ea5a-4ac7-aaf3-e072e2e46e18“
  8. 弘辽科技:关于老店盘活的基础思路。
  9. MySQL数据库的核心MVCC详解
  10. 分享卖货小程序制作方法_怎么在微信上做小程序卖货