2012-11-03 103 views
1

StringBuffer類具有線程安全的方法嗎?好的,但我有問題,當特定的方法將被調用,然後它將被加載到堆棧和堆棧是線程安全的,爲什麼我們需要線程安全的方法?線程安全方法和堆棧

回答

3

它很可能跨越不同的線程在這種情況下,多個線程最終將「改性」或突變該StringBuffer的內部狀態共享一個給定StringBuffer實例。這就是爲什麼需要明確同步StringBuffer上的append方法。

但你說得對。如果你不打算在線程邊界之間共享東西(或者像他們稱之爲「發佈」實例),那麼在給定的方法調用中創建一個StringBuilder實例(這是StringBuffer的非同步兄弟)更合乎邏輯並在方法調用結束後將其扔掉(或者更像是讓GC處理它)。

還有另一個方面,當你絕對必須在線程間共享實例並同時感覺同步每個操作的代價太大時 - 線程本地人才會發揮作用。基本上,這種情況下的想法是讓每個線程擁有自己的「可變」實體副本。不需要任何鎖定,因爲當其他線程嘗試訪問線程局部變量時,您將切換到新的/預先配置的實例。這通常用於共享StringBuilderDateFormat實例,以提高性能。

如果您想比較線程間可變對象的原始/不安全共享與使用本地線程之間的比較,請查看snippet I have hosted on Bitbucket