2014-06-07 41 views
1

字符串對象是不可變的,所以它本質上是線程安全的,所以我可以在線程上下文中不使用同步來使用它。線程上下文中的String對象和StringBuffer對象有什麼區別?

StringBuffer對象具有同步的方法,所以如果線程試圖執行它的方法,沒有同步就不會有問題。

但是使用它的對象作爲線程上下文中的資源需要它有同步。

我無法清楚地理解突出顯示的部分。任何人都可以請解釋或提供代碼的參考,以清除我的疑問。

+0

這不是這種情況。仍然需要同步其呼叫。 – Braj

+8

粗體句子的來源或內容是什麼? –

+1

你需要提供你正在閱讀的內容的參考。另請參閱此文章:http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java –

回答

0

如果看一看的javadoc它指出以下:

每當發生涉及源序列(例如追加或從源序列插入)這個類同步僅在字符串緩衝區的操作執行操作,而不是來源。

這意味着如果多個線程有權訪問源,那麼另一個線程在寫入之前可能會修改源。

一個簡單的例子,這可能會使這一點更清晰。

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

由於您尚未將sharedSource定義爲final,因此您可以將其分配給不同的值。 sharedSource的內容無法更改。字符串是不可變的。在單獨的線程上沒有活動可能會產生任何影響。 –

+0

D'oh,不好的例子,我已經更新了。謝謝@BrettOkken! –

+0

也許一個更好的例子是使用CharSequence或另一個StringBuffer,因爲兩者都是可變的。 –

2

javadocs

每當發生涉及源序列(例如追加或從源序列插入)這個類同步僅在字符串緩衝區執行操作,而不是在一個操作來源。

這意味着,如果你有,例如,這樣的代碼:

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

bufferOne.append(bufferTwo); 

然後只在bufferOne同步,但不bufferTwo。換句話說,當這個操作正在執行時,其他一些線程可能會讀取或寫入bufferTwo

1

字符串是不可變的(一旦創建不能改變)的對象。創建爲String的對象存儲在常量字符串池中。 Java中的每個不可變對象都是線程安全的,這意味着String也是線程安全的。字符串不能被兩個線程同時使用。 曾經分配的字符串不能更改。

String demo = " hello " ; 

//上述對象存儲在常量字符串池中,其值不能修改。

demo="Bye" ; 

//新的「再見」是常量池創建的字符串,並通過演示變量引用
//「你好」字符串仍然存在於字符串常量池的,其價值不overrided但我們失去參考「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()方法可以將字符串緩衝區轉換爲字符串。

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"); 
相關問題