线程上下文中String对象和StringBuffer对象有什么区别?

时间:2014-06-07 12:47:06

标签: java multithreading

字符串对象是不可变的,因此它本身就是线程安全的,所以我可以在线程上下文中使用它而不需要同步。

StringBuffer个对象使方法同步,因此如果线程试图执行其方法,则不会在没有同步的情况下出现问题。

但是在线程上下文中使用其对象作为资源需要它具有同步。

我无法清楚地理解突出显示的部分。任何人都可以解释或提供代码参考,以便它清除我的怀疑。

3 个答案:

答案 0 :(得分:2)

来自javadocs

  

每当涉及源序列的操作发生时(例如从源序列追加或插入),此类仅在执行操作的字符串缓冲区上同步,而不在源上同步。

这意味着,例如,如果您有以下代码:

StringBuffer bufferOne = new StringBuffer("abc");
StringBuffer bufferTwo = new StringBuffer("def");

bufferOne.append(bufferTwo);

然后它仅在bufferOne上同步,而不是bufferTwo。换句话说,在执行此操作时,某些其他线程可能会读取或写入bufferTwo

答案 1 :(得分:1)

String是不可变的(一旦创建无法更改)对象。作为String创建的对象存储在常量字符串池中。 Java中的每个不可变对象都是线程安全的,这意味着String也是线程安全的。两个线程不能同时使用字符串。 分配后的字符串无法更改。

String  demo = " hello " ;

//上述对象存储在常量字符串池中,并且无法修改其值。

demo="Bye" ; 

// new“Bye”字符串在常量池中创建,并由演示变量
引用  //“hello”字符串仍然存在于字符串常量池中,并且其值未被覆盖但我们丢失了对“hello”字符串的引用

StringBuffer是可变的意味着可以更改对象的值。通过StringBuffer创建的对象存储在堆中。 StringBuffer与StringBuilder具有相同的方法,但StringBuffer中的每个方法都是同步的,StringBuffer是线程安全的。

由于这个原因,它不允许两个线程同时访问同一个方法。每个方法一次只能由一个线程访问。

但由于线程安全属性,StringBuffer的性能会受到攻击,因此线程安全也有缺点。因此,当调用每个类的相同方法时,StringBuilder比StringBuffer更快。

 StringBuffer value can be changed , it means it can be assigned to the new value 

可以使用toString()方法将String Buffer转换为字符串。

StringBuffer demo1 = new StringBuffer("Hello") ;

//存储在堆中的上述对象及其值可以更改。

demo1=new StringBuffer("Bye");

//上面的语句是正确的,因为它修改了StringBuffer中允许的值

 StringBuilder  is same as the StringBuffer , that is it stores the object in heap and it can also be modified . The main difference between the StringBuffer and StringBuilder is that StringBuilder is also not thread safe. 

StringBuilder很快,因为它不是线程安全的。

StringBuilder demo2= new StringBuilder("Hello");

//上述对象也存储在堆中,其值可以修改

demo2=new StringBuilder("Bye"); 

答案 2 :(得分:0)

如果您查看javadoc,请说明以下内容:

  

每当涉及源序列的操作发生时(例如从源序列追加或插入),此类仅在执行操作的字符串缓冲区上同步,而不在源上同步。

这意味着如果多个线程可以访问源,则另一个线程可能会在编写源之前修改源。

一个简单的例子,可能会使这一点更清晰。

StrginBuffer sb = new StringBuffer
//some other thread might change the sharedSource.
sb.append(getSharedString());