実稼働Webアプリケーションでは、私の仲間のプログラマーがStringBufferをどこでも使用していました。現在、アプリケーションの開発と修正を担当しています。StringBuilderとStringBufferを読んだ後、すべてのStringBufferコードをStringBuilderに置き換えることにしました。これは、データBeanでスレッドセーフが必要ないためです。
例:(各データBeanでStringBufferの使用を確認できます)
@Override
public String toString() {
StringBuffer sb = new StringBuffer();// replace it from StringBuilder
sb.append(" ABCD : ").append(abcd);
sb.append(", EFGH : ").append(efgh);
sb.append(", IJKL : ").append(ijkl);
}
セッション/リクエストごとに個別のデータBeanを作成します。セッションは、他のユーザーがアクセスできない単一のユーザーによって使用されます。
移行する前に他の点を考慮する必要がありますか?
単一のスレッドがある場合(待機中のスレッドがないか、新しいスレッドがオブジェクトロックを探していない場合)、StringBufferまたはStringBuilderのどちらでも同様に実行されます。StringBufferの場合、オブジェクトロックを取得するのに時間がかかることは知っていますが、オブジェクトロックの保持/解放を除いて、それらの間にパフォーマンスの違いがあるかどうかを知りたいです。
StringBuffer
。そのようなコードを見たことはありませんが、マルチスレッドの観点から見ると、これは悪い設計だとほぼ確信しています。StringBuffer
インターフェースに沿ってスレッドを同期するのは悪い考えだと思うので、このクラスは存在するべきではなく、常に使用するべきだと思いますStringBuilder
。すでに述べたように、StringBuffer
歴史的な理由で存在しています。
sb
例のようにローカル変数として使用する場合、スレッドセーフはまったく問題になりません。たとえ1,000個のスレッドが同時にメソッドに入ったとしても、各スレッドは独自のローカル変数を持つ独自の呼び出しスタックを持ちます。StringBuildersが互いに干渉することはありません。