SimpleDateFormatのjavadocには、SimpleDateFormatが同期されていないと記載されています。
「日付形式は同期されていません。スレッドごとに個別の形式インスタンスを作成することをお勧めします。複数のスレッドが同時に形式にアクセスする場合は、外部で同期する必要があります。」
しかし、マルチスレッド環境でSimpleDateFormatのインスタンスを使用するための最良のアプローチは何ですか。これが私が考えたいくつかのオプションです。私は過去にオプション1と2を使用しましたが、より良い選択肢があるかどうか、またはこれらのオプションのどれが最高のパフォーマンスと並行性を提供するかを知りたいです。
オプション1:必要に応じてローカルインスタンスを作成する
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
オプション2:SimpleDateFormatのインスタンスをクラス変数として作成しますが、アクセスを同期します。
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
オプション3:ThreadLocalを作成して、スレッドごとにSimpleDateFormatの異なるインスタンスを格納します。
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}