4

我想在我的 webapp 中进行一些格式化,使用 MessageFormat、DateFormat、DecimalFormat 等。

由于这些不是线程安全的,因此每次使用一个静态实例将不起作用,但每次需要创建一个新的 XXXXFormat 对象似乎很浪费。使用 ThreadLocal 缓存和重用它们似乎是一种明显的优化。

这似乎是一种非常常见的模式,所以我想知道是否有任何合适的库。

而不是调用:

    DecimalFormat formatter = new DecimalFormat("###,##0.00");

    String formatted = formatter.format(value);             

每次我需要格式化某些东西时,为什么不:

    String formatted = FormatCache.formatDecimal("###,##0.00",numberValue);

FormatCache 会在哪里使用以格式模式为键的 HashMap 进行 ThreadLocal 缓存?

大概还有其他方法,例如:

    String FormatCache.formatDecimal(String, Number);
    String FormatCache.formatDate(String, Date);
    String FormatCache.formatMessage(String, Object...);
4

3 回答 3

5

Apache Commons Lang has FastDateFormat,它以正确的方式(在我看来)解决了问题,首先是线程安全的:

FastDateFormat 是 SimpleDateFormat 的快速且线程安全的版本。

在大多数格式化情况下,此类可用作 SimpleDateFormat 的直接替代品。此类在多线程服务器环境中特别有用。SimpleDateFormat 在任何 JDK 版本中都不是线程安全的,也不会像 Sun 已关闭 bug/RFE 那样。

于 2012-08-03T19:46:49.573 回答
5
于 2018-03-04T23:40:48.453 回答
2

你应该非常小心这样的事情。标准(简单)格式化程序不是线程安全的。我遇到了一些与一些共享/缓存格式化程序相关的多线程问题,但那是几年前的事了(Java 1.4)。如果您检查 JavaDocs ( SimpleDateFormat ),您会注意到以下内容:

同步

日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。

于 2012-08-03T22:12:59.330 回答