我有许多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()
方法可能是静态的,也可能不是静态的,但肯定会被多个不同的线程访问。
上述方法是否会按预期工作?
答案 0 :(得分:3)
直接回答你的问题:是的,每个主题都有自己独特的副本,如SimpleDateFormat文档中所推荐。
答案 1 :(得分:1)
它看起来很不错,但您可以使用多线程程序轻松测试它。只需打印线程的ID(Thread.currentThread().toString()
)和System.identifyHashCode(simpleDateFormat)
,并验证您是否为每个线程获取了唯一的副本并适当地重复使用它们。
答案 2 :(得分:0)
这很好但代码相对复杂。我建议检查一下你可以将SimpleDateFormat分配给方法内的一些局部变量(总是线程本地)。当许多值在循环中格式化然后可以在同一方法中时,这很有效。
答案 3 :(得分:0)
我认为还有一种更优雅的方法,没有人提出过 - 只需为SimpleDateFormat创建一个插入式替换包装类,它同步对其方法的访问。在大多数情况下,我认为同步开销并不比ThreadLocalMap中的哈希查找差。