【发布时间】:2012-05-08 00:57:48
【问题描述】:
我有许多 Java 日期模式,并希望通过静态引用在不同线程中的 SimpleDateFormat 对象中多次重用它们,以提高速度。
代码看起来像这样(在一个名为 FormatClass 的类中):
private static String[] PATTERNS = new String[] {...};
public 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[0]);
}
}
使用上面的代码,另一个类的方法可以format(或parse)多个日期字符串如下:
public static void printFormatted(String date)
{
for (SimpleDateFormat sdf:FormatClass.LOCAL_FORMATS.get())
{
System.out.println(sdf.format(date));
}
}
printFormatted() 方法可能是静态的,也可能不是静态的,但肯定会被多个不同的线程访问。
上述方法会按预期工作吗?
【问题讨论】:
-
使用
toArray方法时,使用new SimpleDateFormat[list.size()]效率更高。 -
不,如果你看toArray()方法的源码,是一模一样的。
-
阅读我给你的链接。不完全相同,如果您提供的数组最初足够大以包含整个列表,它将使用该数组。如果不这样做,它将必须分配一个全新的数组并将其转换为正确的类型。
-
另见stackoverflow.com/questions/11376328/…,这是关于该问题的一个较新的问题,它阐明了对 SimpleDateFormat[] 数组的引用应始终通过 LOCAL_FORMATS.get() 获得,而不是在 public变量到 LOCAL_FORMATS.get() 然后使用该变量来引用数组;在后一种情况下,所有线程都访问数组的同一个副本,这显然不是线程安全的。
标签: java thread-safety simpledateformat thread-local