字符串對象是不可變的,所以它本質上是線程安全的,所以我可以在線程上下文中不使用同步來使用它。線程上下文中的String對象和StringBuffer對象有什麼區別?
StringBuffer
對象具有同步的方法,所以如果線程試圖執行它的方法,沒有同步就不會有問題。
但是使用它的對象作爲線程上下文中的資源需要它有同步。
我無法清楚地理解突出顯示的部分。任何人都可以請解釋或提供代碼的參考,以清除我的疑問。
字符串對象是不可變的,所以它本質上是線程安全的,所以我可以在線程上下文中不使用同步來使用它。線程上下文中的String對象和StringBuffer對象有什麼區別?
StringBuffer
對象具有同步的方法,所以如果線程試圖執行它的方法,沒有同步就不會有問題。
但是使用它的對象作爲線程上下文中的資源需要它有同步。
我無法清楚地理解突出顯示的部分。任何人都可以請解釋或提供代碼的參考,以清除我的疑問。
如果看一看的javadoc它指出以下:
每當發生涉及源序列(例如追加或從源序列插入)這個類同步僅在字符串緩衝區的操作執行操作,而不是來源。
這意味着如果多個線程有權訪問源,那麼另一個線程在寫入之前可能會修改源。
一個簡單的例子,這可能會使這一點更清晰。
StrginBuffer sb = new StringBuffer
//some other thread might change the sharedSource.
sb.append(getSharedString());
由於您尚未將sharedSource定義爲final,因此您可以將其分配給不同的值。 sharedSource的內容無法更改。字符串是不可變的。在單獨的線程上沒有活動可能會產生任何影響。 –
D'oh,不好的例子,我已經更新了。謝謝@BrettOkken! –
也許一個更好的例子是使用CharSequence或另一個StringBuffer,因爲兩者都是可變的。 –
從javadocs:
每當發生涉及源序列(例如追加或從源序列插入)這個類同步僅在字符串緩衝區執行操作,而不是在一個操作來源。
這意味着,如果你有,例如,這樣的代碼:
StringBuffer bufferOne = new StringBuffer("abc");
StringBuffer bufferTwo = new StringBuffer("def");
bufferOne.append(bufferTwo);
然後只在bufferOne
同步,但不bufferTwo
。換句話說,當這個操作正在執行時,其他一些線程可能會讀取或寫入bufferTwo
。
字符串是不可變的(一旦創建不能改變)的對象。創建爲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");
這不是這種情況。仍然需要同步其呼叫。 – Braj
粗體句子的來源或內容是什麼? –
你需要提供你正在閱讀的內容的參考。另請參閱此文章:http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java –