我在Java 1.6中編寫一個webapp並在tomcat中運行它。雖然我沒有做任何明確的線程,但我想知道Spring和Tomcat在幕後發生了什麼。我會遇到任何問題使用StringBuilder而不是StringBuffer?我應該使用StringBuilder還是StringBuffer作爲webapps?
回答
如果您使用的是本地變量,則可以安全使用StringBuilder
。每個線程都將獲得自己的實例。
+1。如果你*在線程之間共享字符串(例如通過使用靜態字段),那麼你應該使用'String'而不是'StringBuilder' *或*'StringBuffer'。 – ruakh
爲了強調ruakh的觀點:在線程之間傳遞不可變數據是安全的方法。 –
如果代碼在Servlet(doGet/doPost)中,那麼多個請求將導致該servlet實例成爲多線程。如果代碼位於Spring bean中,它將取決於您是否將bean配置爲單例或原型。
更準確地說,您應該說:servlet實例可能會被多個服務於不同客戶端的線程共享。 – Razvan
這是一個更好的說法。 :) –
通常,Java EE組件在默認情況下不是線程安全的,因此除非您在使用StringBuilder
的位置同步代碼塊,否則會遇到競爭狀況。所以,你要麼需要照顧同步或使用StringBuffer
。
當然,正如已經提到的,如果StringBuilder
是一個局部變量,您不必擔心這一點。
使用StringBuilder,因爲您的構建器是doPost或doGet中的局部變量或其他。確實,多個服務器線程使用相同的servlet實例,但事實上,您的構建器是一個局部變量,沒有理由擔心!如果您的構建器是您的servlet類的成員,那麼確定您會遇到線程安全問題。這不是我的想法。
Java的醫生說關於java.lang.StringBuffer中:
每當發生涉及源序列的操作(如 追加或從源序列插入)這個類僅在字符串緩衝區同步 執行操作,而不是來源。
這意味着即使您處於多線程環境(如Web應用程序),您的StringBuffer操作也將是安全的。 StringBuffer實例的安全性由變量的範圍決定。
- 1. Stringbuffer,Stringbuilder何時使用?
- 2. StringBuffer vs StringBuilder
- 3. String,StringBuffer和StringBuilder
- 4. 我應該使用JSON還是AJAX作爲響應數據?
- 5. StringBuffer或StringBuilder用於我的查詢
- 6. StringBuffer vs StringBuilder VS StringTokenizer
- 7. 我應該爲我的ios應用使用wsdl還是json?
- 8. 我應該爲我的應用程序使用AsyncTask還是IntentService?
- 9. 我應該使用em還是%作爲邊距和填充?
- 10. 我應該使用Spring還是Guice作爲Tomcat/Wicket/Hibernate項目?
- 11. 我應該使用js還是iframe作爲小部件?
- 12. 我應該使用GregorianCalendar還是Date作爲生日場地?
- 13. 我應該使用RouteParameter還是UrlParameter作爲Asp.NET web-api路由?
- 14. 我應該使用getHours()還是爲我的Javascript使用getUTCHours?
- 15. 黑莓應用程序:Native還是webapps?
- 16. 我應該使用public $ var還是應該使用__construct()?
- 17. 使用POI時,我應該使用Excel作爲工作簿還是HSSFWorkbook?
- 18. 我應該使用PurePDF還是AlivePdf
- 19. 我應該使用ABPersonViewController還是ABUnknownPersonViewController
- 20. 我應該使用Series.replace還是Series.str.replace?
- 21. 我應該使用requestanimationframe還是setTimeout?
- 22. 我應該使用SASS還是SCSS?
- 23. 我應該使用Boost.GIL還是死了?
- 24. 我應該使用Flash還是Java?
- 25. 我應該使用partial還是show.html.erb?
- 26. 我應該使用TNSNAMES.ORA還是tnsnames.ora?
- 27. 我應該使用pygame.event.get()還是pygame.event.poll()?
- 28. 我應該使用BroadcastReceiver還是Service?
- 29. 我應該使用urandom還是openssl_random_pseudo_bytes?
- 30. 我應該使用SyncLock還是Interlocked?
可能重複的[StringBuilder和StringBuffer在Java](http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa
@thinksteep這個問題是假設專注於什麼樣的線程發生在webapps的幕後,以及如何影響String構建。 –
可能不是重複的。這看起來更像是一個關於在Tomcat中進行線程化的問題,而不是StringBuilder/StringBuffer類本身。 –