DecimalFormat.format(double) in different threads

2022-09-01 10:27:34

我必须并行打印许多线程中的许多格式化十进制值。为了格式化十进制值,我使用由模式配置的。我知道来自java文档的警告:java.text.DecimalFormatDecimalFormat

十进制格式通常不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部同步该格式。

但我不知道此警告是否适用于我的方案:我在应用程序启动时配置一次(并将 存储在最终字段中)。之后,我只使用该方法。java.text.DecimalFormatFormatterformat(double)

我想这样做的原因是:我不想在每次需要打印格式化数字时都通过创建新实例来损失性能。DecimalFormat

我看了一下代码,它看起来是线程安全的,但我不确定。DecimalFormat.format(double)

您能否确认DecimalFormat.format(double)的使用最终是线程安全的,当不更改格式化程序的配置时,或者解释为什么它不是?


答案 1

只需将此线程安全代码段用于:NumberFormat

static ThreadLocal<NumberFormat> numberFormat = new ThreadLocal<NumberFormat>() {
    @Override
    public NumberFormat initialValue() {
        return new DecimalFormat("00000");
    }
};

或者在Java 8中,正如Jesper在评论中所说的那样:

private static ThreadLocal<NumberFormat> numberFormatter = 
                  ThreadLocal.withInitial(() -> new DecimalFormat("00000"));

答案 2

虽然当前的实现最终可能是线程安全的,但对于即将到来的实现或其他 JRE 来说,没有这样的保证。

您是否验证过避免在您的应用程序中是一种可衡量的性能提升?new DecimalFormat()