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:スレッドごとにSimpleDateFormatの異なるインスタンスを格納するThreadLocalを作成します。
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);
}