【发布时间】:2012-07-07 15:39:05
【问题描述】:
使用与recent question 中描述的模式非常相似的模式,对于多线程应用程序,我得到了奇怪的日期值(例如,像 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的使用?
【问题讨论】:
标签: java thread-safety simpledateformat thread-local