2012-08-23 67 views
5

我在Java 1.6中編寫一個webapp並在tomcat中運行它。雖然我沒有做任何明確的線程,但我想知道Spring和Tomcat在幕後發生了什麼。我會遇到任何問題使用StringBuilder而不是StringBuffer?我應該使用StringBuilder還是StringBuffer作爲webapps?

+0

可能重複的[StringBuilder和StringBuffer在Java](http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa

+0

@thinksteep這個問題是假設專注於什麼樣的線程發生在webapps的幕後,以及如何影響String構建。 –

+4

可能不是重複的。這看起來更像是一個關於在Tomcat中進行線程化的問題,而不是StringBuilder/StringBuffer類本身。 –

回答

10

如果您使用的是本地變量,則可以安全使用StringBuilder。每個線程都將獲得自己的實例。

+4

+1。如果你*在線程之間共享字符串(例如通過使用靜態字段),那麼你應該使用'String'而不是'StringBuilder' *或*'StringBuffer'。 – ruakh

+3

爲了強調ruakh的觀點:在線程之間傳遞不可變數據是安全的方法。 –

0

如果代碼在Servlet(doGet/doPost)中,那麼多個請求將導致該servlet實例成爲多線程。如果代碼位於Spring bean中,它將取決於您是否將bean配置爲單例或原型。

+0

更準確地說,您應該說:servlet實例可能會被多個服務於不同客戶端的線程共享。 – Razvan

+0

這是一個更好的說法。 :) –

1

通常,Java EE組件在默認情況下不是線程安全的,因此除非您在使用StringBuilder的位置同步代碼塊,否則會遇到競爭狀況。所以,你要麼需要照顧同步或使用StringBuffer

當然,正如已經提到的,如果StringBuilder是一個局部變量,您不必擔心這一點。

0

使用StringBuilder,因爲您的構建器是doPost或doGet中的局部變量或其他。確實,多個服務器線程使用相同的servlet實例,但事實上,您的構建器是一個局部變量,沒有理由擔心!如果您的構建器是您的servlet類的成員,那麼確定您會遇到線程安全問題。這不是我的想法。

0

Java的醫生說關於java.lang.StringBuffer中:

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

這意味着即使您處於多線程環境(如Web應用程序),您的StringBuffer操作也將是安全的。 StringBuffer實例的安全性由變量的範圍決定。

相關問題