怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的相关的知识,希望对你有一定的参考价值。
1.多个线程操作同一个StringBuffer对象会顺序进行(内部很多方法是同步方法)2.多个线程操作同一个StringBuilder是同时的,这时候可能出现与预期不符合的结果
3.StringBuilder由于是线程不安全的,所以性能更好。大部分情况下都是单线程操作字符串,这时候选择StringBuilder。 参考技术A 线程安全,主要是指多线程操作同一个数据时,防止脏数据的产生。主要的应用场景是应用缓存,缓存是整个系统公用的数据,在多线程系统中,线程的异步访问和修改会导致数据产生异常。
考虑一个场景,A和B两个线程同时操作缓存中的一条数据,A线程对数据进行自加处理,B线程对数据进行校验,如果校验不过,就清除数据。
非线程安全的情况:当A获取到这条数据,准备修改时,B线程进来了,校验完数据,发现数据不正确,就把数据移除了,这时A线程仍旧认为当前持有的数据还是开始获取的数据,这样再做处理就会报空。
线程安全的情况:就是当一个线程需要对这个数据进行改写时,会给这个数据上一个同步锁,比如A线程拿到数据后,给数据加上同步锁,这时候B线程进来了,但是这时候数据已经上锁,B线程则需要等待A线程释放锁之后才能对数据进行操作,这样就防止了脏数据的产生。
Java API的Stringbuffer 和 HashTable是在较低版本的JDK中提供的。随着软件项目越来越负责,系统对于性能要求越来越高,然而线程的同步访问对系统性能有很大的影响,所以才会有效率更高的StringBuilder和HashMap的产生。当然在使用这些非线程安全的集合时,线程安全问题就需要开发人员自己控制。
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
StringBuffer
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
速度
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
StringBuffer StringBuilder线程安全的理解
1
2
3
4
5
6
7
8
|
/** * @see java.lang.String#valueOf(java.lang.Object) * @see #append(java.lang.String) */ public synchronized StringBuffer append(Object obj) { super .append(String.valueOf(obj)); return this ; } |
StringBuffer中大部分方法都有synchronized 关键字,保证了在多线程的情况下对统一资源使用的安全性
1
2
3
4
5
6
7
8
|
/** * @see java.lang.String#valueOf(java.lang.Object) * @see #append(java.lang.String) */ public synchronized StringBuffer append(Object obj) { super .append(String.valueOf(obj)); return this ; } |
StringBuffer中大部分方法都有synchronized 关键字,保证了在多线程的情况下对统一资源使用的安全性
以上是关于怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的的主要内容,如果未能解决你的问题,请参考以下文章
Java - JavaSE - String | StringBuffer
理解StringStringBuilder和StringBuffer