9

我知道 SimpleDateFormat 和 NumberFormat 不是线程安全的。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500

但是像 MessageFormat 这样的其他 Format 类呢?

Fortify 360 将使用“MessageFormat.format(String, Object...)”静态方法标记为“Race Condition - Format Flaw”问题,但是当我分析 MessageFormat 的源代码时,我在该方法中看到了这一点,它会创建 MessageFormat 本身的新本地实例。

Java MessageFormat 类线程安全吗?

4

3 回答 3

11

javadocMessageFormat说:_

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

所以正式地说,不 - 它不是线程安全的。

的文档SimpleDateFormat说了很多同样的话。

现在,文档可能只是保守,实际上它可以在多个线程中正常工作,但不值得冒险。

于 2010-07-15T15:28:15.953 回答
8

如果您指的是方法

public static String format(String pattern, Object... arguments)

这是线程安全的,因为如 javadoc 中所述,它创建了一个新的 MessageFormat 来进行格式化。

顺便说一句,你的标题“SimpleThreadFormat”中有一个有趣的错字:)

于 2010-07-15T15:48:52.940 回答
0

根据 javadoc,MessageFormat对象不是线程安全的。您可以使用 aThreadLocal为需要一个的每个线程创建一个单独的对象。

ThreadLocal<MessageFormat> threadLocalMessageFormat =
    new ThreadLocal<MessageFormat>() {
        @Override
        protected MessageFormat initialValue() {
            return new MessageFormat(pattern);
        }
    };

然后您可以使用为当前线程threadLocalMessageFormat.get()获取一个。MessageFormat

于 2018-03-07T22:38:14.377 回答