怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的

作者&投稿:尘浦 (若有异议请与网页底部的电邮联系)
怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的~

线程安全,主要是指多线程操作同一个数据时,防止脏数据的产生。主要的应用场景是应用缓存,缓存是整个系统公用的数据,在多线程系统中,线程的异步访问和修改会导致数据产生异常。
考虑一个场景,A和B两个线程同时操作缓存中的一条数据,A线程对数据进行自加处理,B线程对数据进行校验,如果校验不过,就清除数据。
非线程安全的情况:当A获取到这条数据,准备修改时,B线程进来了,校验完数据,发现数据不正确,就把数据移除了,这时A线程仍旧认为当前持有的数据还是开始获取的数据,这样再做处理就会报空了。
线程安全的情况:就是当一个线程需要对这个数据进行改写时,会给这个数据上一个同步锁,比如A线程拿到数据后,给数据加上同步锁,这时候B线程进来了,但是这时候数据已经上锁,B线程则需要等待A线程释放锁之后才能对数据进行操作,这样就防止了脏数据的产生。
Java API的Stringbuffer 和 HashTable是在较低版本的JDK中提供的。随着软件项目越来越负责,系统对于性能要求越来越高,然而线程的同步访问对系统性能有很大的影响,所以才会有效率更高的StringBuilder和HashMap的产生。当然在使用这些非线程安全的集合时,线程安全问题就需要开发人员自己控制了。

StringBuffer的很多方法用synchronized修饰,意味着多个线程只能互斥地调用这个方法。
例如StringBuffer的append方法,对于多线程编程,多个线程不能同时使用这个方法。

StringBuilder的方法没有这个限制。如果用于多线程程序,可能会造成错误。
一个方法包含若干语句,编译成二进制代码就更多了。线程随时可能被中断,比如时间片中断、按键中断、网卡有数据到达引发中断等。线程A在执行append,还没完成就中断了。线程B运行,也执行这个串对象的append。随后A继续append未完的部分。会造成错误。如果你学过OS就会知道这点。

  1. 线程安全,主要是指多线程操作同一个数据时,防止脏数据的产生。主要的应用场景是应用缓存,缓存是整个系统公用的数据,在多线程系统中,线程的异步访问和修改会导致数据产生异常。

  2. 考虑一个场景,A和B两个线程同时操作缓存中的一条数据,A线程对数据进行自加处理,B线程对数据进行校验,如果校验不过,就清除数据。

  3. 非线程安全的情况:当A获取到这条数据,准备修改时,B线程进来了,校验完数据,发现数据不正确,就把数据移除了,这时A线程仍旧认为当前持有的数据还是开始获取的数据,这样再做处理就会报空。

  4. 线程安全的情况:就是当一个线程需要对这个数据进行改写时,会给这个数据上一个同步锁,比如A线程拿到数据后,给数据加上同步锁,这时候B线程进来了,但是这时候数据已经上锁,B线程则需要等待A线程释放锁之后才能对数据进行操作,这样就防止了脏数据的产生。

  5. Java API的Stringbuffer 和 HashTable是在较低版本的JDK中提供的。随着软件项目越来越负责,系统对于性能要求越来越高,然而线程的同步访问对系统性能有很大的影响,所以才会有效率更高的StringBuilder和HashMap的产生。当然在使用这些非线程安全的集合时,线程安全问题就需要开发人员自己控制。

  6. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

  7. StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区 
    StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区 
    StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

  8. StringBuffer
      StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。

  9. 线程安全 
    StringBuffer 线程安全 
    StringBuilder 线程不安全

  10. 速度
    一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。

  11. 总结
    (1).如果要操作少量的数据用 = String
    (2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    (3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer




string是什么数据类型
string属于Java中的字符串类型,也是一个引用类型,并不属于基本的数据类型。Java是一门面向对象编程语言,不仅吸收C加加语言的各种优点,还摒弃C加加里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现面向对象理论,允许程序员...

String和String的区别
1.首先String不属于8种基本数据类型,String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。2.new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;3.String str=”kvill”;String str=new String (...

python中的string是什么意思
string:编程语言中的字符串

在C#中string 和String到底有没有区别
有区别。编译层面上, 编译器遇到string时 ,会把他大写处理。 因此可以简单的理解String 包含string的功能,反之则不行。语法层面上来讲,string是C#保留字,String则是类名。比如下面的写法:string str = String.Empty; \/\/声明一个str ,str的值是空字符 这里你要用string.Empty肯定就报错了。而...

c#中string的用法?
string 是引用变量,money 是这个变量的对象,在修改值的时候可以理解为重新创建了一个string的对象 这个新的对象也叫 money ,并且取代了之前 money 然后清理掉之前的对象 则也是string 的对象在大量操作的时候会慢的原因,因为每次操作都会重新创建对象,当然这个工作是后台自动完成的 ...

string在c语言中的用法
string在C语言中的用法有定义字符串、访问字符串中的字符、字符串的复制、字符串的比较。1、定义字符串:在C语言中,可以使用字符数组来定义一个字符串。例如,char str=Hello,World。这行代码定义了一个字符数组str,其中包含了字符串Hello,World。2、访问字符串中的字符:可以通过索引访问字符串中的...

字符串(string)几个常用方法的详解
并使用指定的分隔符将这些子字符串连接起来。这个方法不会改变原始的子字符串。以上就是对字符串中几个常用方法的详解。这些方法在Python编程中非常常见,对于处理文本数据和执行字符串操作非常有用。理解这些方法的功能和使用方式,可以帮助开发者更有效地处理字符串数据。

在C#中 string 和 String有什么区别
String是整个.net环境下的字符串类型,string是在C#中对String起的别名,使用上没有任何区别。就像Int32和int一样,也是这种情况

如何理解 String 类型值的不可变
其实很多参考书有说明。初始化String时,引用一个地址存放初始值。但是当我们操作赋值时,表面上看是值变了,但实际上是新建了一个字符串存放了新的值,虽然变量名还是原来的,但其实存放的引用地址与原来不一样了。

如何理解 String 类型值的不可变
举例:String str = "hello world";相当于str是一个常量,当对str进行操作的时候,比如 str += "test";它不是简单的在"hello world"后面加上"test",而是在内存中重新开一个空间,先拷贝"hello world"再接着拷贝"test"组成新的 字符串"hello worldtest",并把这个...

九里区13091962039: StringBuffer - 搜狗百科
闭晶普必: String是不可变的类型,即创建一个String对象后,就不能修改这个String,平常使用的"aa"+"bb"生成"aabb"这个过程中,实际是创建了三个String对象:"aa", "bb", "aabb" StringBuffer是相对于String的一个可变的类型,StringBuffer可以在原对象上进行加长或缩短等修改操作.适用于需要大量连接字串或拼接处理字串的情况,相应的情况下就不宜使用String对象了.

九里区13091962039: javaStringBuffer和StringTokenizer怎么理解? -
闭晶普必: StringBuffer类: 字符串变量.可修改的字符串序列,该类的对象实体内存空间可以自动改变大小,便于存放一个可变的字符序列. StringBuffer类有3个构造方法: StringBuffer() StringBuffer(int size) StirngBuffer(String s) 当使用第1个无参数的构...

九里区13091962039: java中解释一下StringBuffer,String与StringBuilder的区别,举一些简单的例子 -
闭晶普必: java.lang.StringBuffer线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容.可将字符串缓冲区安全地用于多个线程...

九里区13091962039: StringBuffer和String的区别 -
闭晶普必: String 操作后都是产生一个新的字符串对象,而stringBuffer操作的始终是原对象, 当字符串长度大时,并且多字要进行字符串连接时,使用 StringBuffer 性能要高许多. 而且 StringBuffer 是线程同步的.

九里区13091962039: String 和StringBuffer的区别 -
闭晶普必: STRING的长度是不可变的,STRINGBUFFER的长度是可变的.如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法 ...........................

九里区13091962039: StringBuffer与String的区别
闭晶普必: String:定义的字符串一般情况下不轻易改变.可看作固定长度的字符串变量. StringBuffer:定义的字符串可以随时改变.可看作不固定长度的字符串变量. String定义的字符串要比StringBuffer定义的字符串消耗资源多一点.

九里区13091962039: JAVA 中的StringBuffer是什么东西,是拿来干什么的. -
闭晶普必: 你可以看 它与String的区别 主要用于拼接字符串 是一个可变长的字符窜1、StringBuffer对象的初始化 StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化. 例如:...

九里区13091962039: string和stringbuffer类的区别 -
闭晶普必: String与StringBuffer的区别 简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象. StringBuffer 的内部实现方式和String不同,StringBuffer在进行字符串...

九里区13091962039: String和StringBuffer有什么区别啊? -
闭晶普必: StringBuffer是一个具有对象引用传递特点的字符串对象.StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网