最近の質問で説明されているものと非常によく似たパターンを使用して、マルチスレッド アプリケーションの場合、奇妙な日付値を取得しています (たとえば、2025 年や 2035 年など、ソース データにそのような値が明らかに存在しない場合)。同時実行の問題が発生しているようです。
ソースコードは次のようになります
// Various Java DateFormat patterns, e.g. "yyyy-MM-dd".
private static final String[] DATE_PATTERNS = new String[] {...};
private static SimpleDateFormat[] getFormats(final String[] patterns)
{
ThreadLocal<SimpleDateFormat[]> LOCAL_FORMATS = new ThreadLocal<SimpleDateFormat[]>()
{
@Override
protected SimpleDateFormat[] initialValue()
{
List<SimpleDateFormat> formatList = new ArrayList<SimpleDateFormat>();
for (String pattern:patterns)
{
formatList.add(new SimpleDateFormat(pattern));
}
return formatList.toArray(new SimpleDateFormat[formatList.size()]);
}
};
return LOCAL_FORMATS.get(); // Create a thread-local copy
}
private static final SimpleDateFormat[] DATE_FORMATS = getFormats(DATE_PATTERNS);
静的な初期化の後、DATE_FORMATS
配列は多数のクラスによってアクセスされます。これらのクラスはSimpleDateFormat
、配列のオブジェクトを使用して、いくつかの日付文字列を解析またはフォーマットします。
特に を使用する場合、このような使用シナリオで同時実行性の問題が発生する可能性はありThreadLocal
ますか?