複数のスレッドを意識的に作成していない限り、同期されたコレクション(または他のもの)を使用しないことは良い(安全な)経験則ですか?
いいえそうではありません。
意識的に作成しなくても、複数のスレッドが関係する場合があります。たとえば、Swingまたはサーブレットを使用するアプリケーションには、異なるスレッド上のアプリケーションコード間の相互作用の可能性があります。(そして、標準のスレッドプール実装を使用する場合は、明示的にスレッドを作成しないと主張することもできます。)
さらに、同期されたコレクションを使用しても、必ずしもスレッドセーフが得られるとは限りません。
しかし、データ構造を使用する複数のスレッドの可能性がないときに同期されたデータ構造を使用することは(ある程度)無駄であるという意味で正しいです。しかし、ミューテックスが高価だった昔ほど無駄なことはありません。
つまり、「可能な限り新しいStringBuilderを使用してください。」というメッセージが表示されました。知りたいのは、それが可能であることをどのように確認できるかということです。
あなたのコードを理解することによって。StringBuilder
他のスレッドで見ることができますか?そうでない場合は、安全に使用できます。StringBuilder
それ以外の場合は、同期の必要性を共有するスレッド。これを行う1つの方法は、を使用することですが、必ずしも適切な同期の粒度が得られるStringBuffer
とは限りません。
簡単な例を次に示します。
public String nTimes(String str, int n) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) sb.append(str);
return sb.toString();
}
上記では、StringBuilder
insb
は別のスレッドからは見えないため、同期する必要はありません。