使用与最近一个问题中描述的模式非常相似的模式,对于多线程应用程序,我得到了奇怪的日期值(例如,像 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
?