Безопасен ли поток Java MessageFormat Class? (в отличие от SimpleDateFormat)

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

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

Fortify 360 отмечает использование статического метода "MessageFormat.format(String, Object...)" как проблему "Race Condition - Format Flaw", но когда я проанализировал исходный код MessageFormat, я увидел, что в этом методе, он создает новый локальный экземпляр самого MessageFormat.

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

3 ответа

Решение

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

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

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

Документы для SimpleDateFormat сказать то же самое.

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

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

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

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

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

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

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

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

Другие вопросы по тегам