2012-08-23 33 views
5

Tôi viết một webapp trong Java 1.6 và chạy nó trong tomcat. Trong khi tôi không thực hiện bất kỳ luồng nào rõ ràng, tôi tự hỏi về những gì đang xảy ra đằng sau hậu trường với Spring và Tomcat. Tôi có gặp phải bất kỳ vấn đề nào khi sử dụng StringBuilder thay cho StringBuffer không?Tôi có nên sử dụng StringBuilder hoặc StringBuffer cho các ứng dụng web không?

+0

có thể trùng lặp của [StringBuilder và StringBuffer trong Java] (http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa

+0

@thinksteep Câu hỏi này được giả định là tập trung vào loại luồng xảy ra đằng sau hậu trường trong các ứng dụng web và cách ảnh hưởng đến xây dựng Chuỗi. –

+4

Có thể không phải là bản sao. Điều này dường như là một câu hỏi về việc phân luồng trong Tomcat hơn là các lớp StringBuilder/StringBuffer. –

Trả lời

10

Nếu bạn đang sử dụng biến cục bộ, bạn có thể sử dụng an toàn StringBuilder. Mỗi thread sẽ có được một cá thể riêng.

+4

+1. Và nếu bạn * đang chia sẻ chuỗi giữa các chuỗi (ví dụ: bằng cách sử dụng các trường tĩnh), thì có thể bạn đang sử dụng 'Chuỗi' thay vì' StringBuilder' * hoặc * 'StringBuffer'. – ruakh

+3

Để nhấn mạnh điểm của ruakh: truyền dữ liệu bất biến giữa các luồng là cách tiếp cận an toàn. –

0

nếu mã nằm trong Servlet (doGet/doPost) thì nhiều yêu cầu sẽ khiến cá thể servlet trở thành đa luồng. Nếu mã nằm trong bean Spring, nó sẽ phụ thuộc vào việc bạn đã cấu hình bean thành một singleton hay prototype.

+0

Để chính xác hơn, bạn nên nói: rằng thể hiện servlet có thể được chia sẻ bởi nhiều luồng phục vụ các máy khách khác nhau. – Razvan

+0

đó là cách tốt hơn để nói điều đó. :) –

1

Thông thường các thành phần Java EE không an toàn theo luồng, do đó, trừ khi bạn đồng bộ hóa các khối mã nơi bạn sử dụng StringBuilder, bạn sẽ gặp phải các điều kiện chủng tộc. Vì vậy, bạn phải chăm sóc đồng bộ hóa hoặc sử dụng StringBuffer.

Tất nhiên, như đã đề cập nếu StringBuilder là biến cục bộ, bạn không phải lo lắng về điều đó.

0

Sử dụng StringBuilder vì trình tạo của bạn là biến cục bộ trong doPost hoặc doGet hoặc khác. Đúng là nhiều chủ đề máy chủ sử dụng cùng một cá thể servlet nhưng thực tế là trình xây dựng của bạn là một biến cục bộ, không có lý do gì phải lo lắng! Nếu người xây dựng của bạn là một thành viên của lớp servlet của bạn, chắc chắn bạn sẽ gặp vấn đề về an toàn luồng. Nó không phải là trường hợp của bạn tôi đoán.

0

Java doc nói về java.lang.StringBuffer:

Bất cứ khi nào một hoạt động xảy ra liên quan đến một chuỗi nguồn (như phụ thêm hoặc chèn từ một chuỗi nguồn) lớp này đồng bộ hóa chỉ trên đệm chuỗi thực hiện thao tác, không phải trên nguồn.

Điều này có nghĩa là hoạt động của bạn trên StringBuffer sẽ an toàn ngay cả khi bạn đang ở trong môi trường nhiều luồng [như ứng dụng web]. Sự an toàn của cá thể StringBuffer của bạn như vậy được điều chỉnh bởi phạm vi của biến.