Безопасен ли поток 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
для текущей темы.