Безопасен ли поток Java MessageFormat Class? (в отличие от SimpleDateFormat) - PullRequest
7 голосов
/ 15 июля 2010

Я знаю, что SimpleDateFormat и NumberFormat НЕ являются потокобезопасными.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500

А как насчет других классов Format, таких как MessageFormat?

Fortify 360 отмечает использование статического метода «MessageFormat.format (String, Object ...)» как проблему «Состояние гонки - Ошибка форматирования», но когда я анализировал исходный код MessageFormat, я увидел в этом методе он создает новый локальный экземпляр самого MessageFormat.

Безопасен ли поток Java MessageFormat Class?

Ответы [ 3 ]

10 голосов
/ 15 июля 2010

javadoc для MessageFormat говорит:

Форматы сообщений не синхронизированы.Рекомендуется создавать отдельные экземпляры формата для каждого потока.Если несколько потоков обращаются к формату одновременно, он должен быть синхронизирован извне.

Так что официально, нет - это не потокобезопасно.

Документы для SimpleDateFormat говорят примерно то же самоевещь.

Теперь документы могут быть просто консервативными, и на практике это будет прекрасно работать в нескольких потоках, но это не стоит риска.

6 голосов
/ 15 июля 2010

Если вы ссылаетесь на метод

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

это поточно-ориентированный, поскольку, как описано в javadoc, он создает новый формат сообщений для форматирования.

Кстати, это забавная опечатка в заголовке 'SimpleThreadFormat':)

0 голосов
/ 08 марта 2018

Согласно javadoc, MessageFormat объекты не являются поточно-ориентированными.Вы можете использовать ThreadLocal для создания отдельного объекта для каждого потока, который в этом нуждается.

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

Затем можно использовать threadLocalMessageFormat.get(), чтобы получить MessageFormat для текущегонить.

...