“没用”的StringBuffer,StringBuffer被StringBuilder取代的原因
目录
- 前言与问题
- 分析与验证
- 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取代的原因相关推荐
- String、StringBuffer、与StringBuilder的区别
原文:http://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html String.StringB ...
- Java String,StringBuilder和StringBuffer的区别 StringBuilder StringBuffer String
可以证明,字符串操作是计算机程序设计中最常见的行为. String:不可变的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原St ...
- java.lang包—StringBuffer类和StringBuilder类
目录 一.数据结构 二.线程安全性分析 三.源码 四.适用场景 一.数据结构 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串.String 类是不可变类,即一旦一 ...
- 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类
第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...
- StringBuffer类和StringBuilder类
1.StringBuffer 类基本介绍 java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删. 很多方法与String相同,但StringBuffer是可变长度的 ...
- String类、StringBuffer类与StringBuilder类
一.三者的区别 [Java中的String,StringBuilder,StringBuffer三者的区别 - 酥风 - 博客园] String 类 :不可变字符序列 StringBu ...
- String,StringBuffer,StringBuffer的区别
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的地位不言而喻,那 ...
- 常用API-1(Object类、String类、StringBuffer类、StringBuilder类)
1. Object类 Java语言的根类,即所有类的父类. 1.1 clone() 返回一个Object对象的复制.这个复制返回的是一个新对象. clone() 是 Object 的 protecte ...
- String类、StringBuffer类、StringBuilder类的区别
String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼 ...
最新文章
- ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题
- Java finally
- azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?
- pythonmatplotlib刷新_matplotlib:如何刷新figure.canvas
- 解决eclipse/myeclipse导入项目时出现红色叹号的方法
- PHP学习笔记四(超级全局变量 和 魔术常量)
- SQL Server 2016下载及安装教程
- 中日交流日本语初级上
- 谷歌云计算技术基础架构,谷歌人工智能算法框架
- 蜗牛学院:中国人,努力获得了荣誉却要压抑克制
- jQuery的页面加载完毕事件?
- 程序员去大公司面试,阿里P8面试官都说太详细了,社招面试心得
- 金钱找零问题,招行笔试题
- 如何使用github?
- 使用python连接clickhouse并发送邮件
- 28所示范性微电子院校占地面积排名,中山大学第一!
- Activiti工作流使用之SpringBoot整合Activiti
- 机器阅读理解技术初探Bi-DAF
- 观《华尔街:金钱永不眠》有感
- 惆怅长岑长惆怅长岑长惆怅长岑长吃吃吃
热门文章
- 如何做Unity手游性能优化的
- QTcpServer 服务器监听失败
- maven install失败的问题
- 如何将图片识别为可编辑的Word文件
- 虚拟化、虚拟机等概念理解
- Try-with-resources are not supported at language level ‘5‘ 报错
- MountVolume.NewMounter initialization failed for volume “pvc-61dedc85-ea5a-4ac7-aaf3-e072e2e46e18“
- 弘辽科技:关于老店盘活的基础思路。
- MySQL数据库的核心MVCC详解
- 分享卖货小程序制作方法_怎么在微信上做小程序卖货