Java 1.6 で webapp を作成し、tomcat で実行しています。私は明示的なスレッド化を行っていませんが、Spring と Tomcat の舞台裏で何が起こっているのか疑問に思っています。StringBuffer の代わりに StringBuilder を使用すると問題が発生しますか?
5 に答える
ローカル変数を使用している場合は、を安全に使用できますStringBuilder
。各スレッドは独自のインスタンスを取得します。
通常、Java EEコンポーネントはデフォルトではスレッドセーフではないため、を使用するコードのブロックを同期しない限り、StringBuilder
競合状態が発生します。したがって、同期を処理するか、を使用する必要がありますStringBuffer
。
もちろん、StringBuilder
がローカル変数である場合はすでに述べたように、それについて心配する必要はありません。
ビルダーは doPost や doGet などのローカル変数であるため、StringBuilder を使用します。複数のサーバー スレッドが同じサーブレット インスタンスを使用するのは事実ですが、ビルダーがローカル変数であるという事実を考えると、心配する必要はありません。ビルダーがサーブレット クラスのメンバーである場合は、スレッド セーフの問題が発生します。それはあなたの場合ではないと思います。
コードがサーブレット(doGet / doPost)にある場合、複数のリクエストによりサーブレットインスタンスがマルチスレッド化されます。コードがSpringBeanにある場合は、Beanをシングルトンまたはプロトタイプのどちらに構成したかによって異なります。
Java doc は、java.lang.StringBuffer に関して次のように述べています。
ソース シーケンスに関連する操作 (ソース シーケンスからの追加や挿入など) が発生するたびに、このクラスは、ソースではなく、操作を実行する文字列バッファーでのみ同期します。
これは、[Web アプリのような] マルチスレッド環境であっても、StringBuffer に対する操作が安全であることを意味します。StringBuffer インスタンス自体の安全性は、変数のスコープによって管理されます。