Java MessageFormat 类线程安全吗? (与 SimpleDateFormat 相反)

发布于 2024-09-10 05:19:09 字数 449 浏览 2 评论 0原文

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

但是其他 Format 类(例如 MessageFormat)又如何呢?

Fortify 360 将“MessageFormat.format(String, Object...)”静态方法的使用标记为“竞争条件 - 格式缺陷”问题,但是当我分析 MessageFormat 的源代码时,我在该方法中看到了这一点,它创建 MessageFormat 本身的一个新的本地实例。

Java MessageFormat 类线程安全吗?

I know that SimpleDateFormat and NumberFormat are NOT thread safe.
https://bugs.java.com/bugdatabase/view_bug?bug_id=4101500

But what about the other Format classes like MessageFormat?

Fortify 360 is flagging the use of "MessageFormat.format(String, Object...)" static method as a "Race Condition - Format Flaw" issue, but when I analyze the the source code of MessageFormat, I saw that in that method, it creates a new local instance of MessageFormat itself.

Is the Java MessageFormat Class thread safe?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

很快妥协 2024-09-17 05:19:09

javadoc MessageFormat 说:

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

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

SimpleDateFormat 的文档也说了同样的事情。

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

The javadoc for MessageFormat says:

Message formats are not synchronized.
It is recommended to create separate
format instances for each thread. If
multiple threads access a format
concurrently, it must be synchronized
externally.

So officially, no - it's not thread-safe.

The docs for SimpleDateFormat say much the same thing.

Now, the docs may just be being conservative, and in practice it'll work just fine in multiple threads, but it's not worth the risk.

阳光下的泡沫是彩色的 2024-09-17 05:19:09

如果您引用该方法,那么

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

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

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

If you are referrring to the method

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

this is thread-safe since as described in the javadoc it creates a new MessageFormat to do the formatting.

BTW, thats a funny typo in your title 'SimpleThreadFormat' :)

弥繁 2024-09-17 05:19:09

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

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

然后,您可以使用threadLocalMessageFormat.get() 获取当前线程的MessageFormat

Per the javadoc, MessageFormat objects are not thread-safe. You can use a ThreadLocal to create a separate object for each thread that needs one.

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

You can then use threadLocalMessageFormat.get() to obtain a MessageFormat for the current thread.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文