2

SimpleDateFormat我有许多 Java 日期模式,并希望通过静态引用在不同线程的对象中多次重用它们以提高速度。

代码看起来像这样(在一个名为 的类中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()方法可能是静态的,也可能不是静态的,但肯定会被多个不同的线程访问。

上述方法会按预期工作吗?

4

4 回答 4

3

直接回答您的问题:是的,每个线程都会有自己独特的副本,如 SimpleDateFormat 文档中所建议的那样。

于 2012-05-08T01:15:00.233 回答
1

它看起来很不错,但是您可以使用多线程程序轻松测试它。只需打印线程的 ID ( Thread.currentThread().toString())System.identifyHashCode(simpleDateFormat)并验证您是否为每个线程获取了唯一的副本并适当地重用它们。

于 2012-05-08T01:08:09.850 回答
0

这很好用,但代码相对复杂。我建议检查一下您是否可以将 SimpleDateFormat 分配给方法内的某个局部变量(始终是线程本地的)。当许多值在一个循环中格式化,然后可以在同一个方法中时,这很有效。

于 2013-04-30T07:42:19.333 回答
0

我认为还有一种更优雅的方法,目前还没有人提出过——只需为 SimpleDateFormat 创建一个替换包装类,以同步对其方法的访问。在大多数情况下,我认为同步开销并不比 ThreadLocalMap 中的哈希查找差。

于 2013-12-09T17:54:08.880 回答