Является ли класс Java MessageFormat потокобезопасным?(в отличие от SimpleDateFormat)
-
16-09-2020 - |
Вопрос
Я знаю, что SimpleDateFormat и NumberFormat не являются потокобезопасными.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
Но как насчет других классов формата, таких как MessageFormat?
Fortify 360 помечает использование статического метода "MessageFormat.format(String, Object...)" как проблему "Условия гонки - ошибка формата", но когда я проанализировал исходный код MessageFormat, я увидел, что в этом методе он создает новый локальный экземпляр самого MessageFormat.
Является ли класс Java MessageFormat потокобезопасным?
Решение
javadoc Для MessageFormat
говорит:
Форматы сообщенийне синхронизируются. Рекомендуется создавать отдельные Формат экземпляров для каждого потока.Если Несколько потоков доступа к формату одновременно это должно быть синхронизировано снаружи.
Официально, нет - это не безрезультатно.
Документы для SimpleDateFormat
говорят о том же.
Теперь документы могут быть консервативными, а на практике он будет работать просто в нескольких потоках, но это не стоит риска.
Другие советы
Если вы обратитесь к методу
public static String format(String pattern, Object... arguments)
.
Это резьба, поскольку, как описано в Javadoc, это создает новый MessageFormat, чтобы сделать форматирование.
BTW, это забавная опечатка в вашем названии «SimpleThreadFormat» :)
Согласно javadoc, MessageFormat
объекты не являются потокобезопасными.Вы можете использовать ThreadLocal
чтобы создать отдельный объект для каждого потока, которому он нужен.
ThreadLocal<MessageFormat> threadLocalMessageFormat =
new ThreadLocal<MessageFormat>() {
@Override
protected MessageFormat initialValue() {
return new MessageFormat(pattern);
}
};
Затем вы можете использовать threadLocalMessageFormat.get()
чтобы получить MessageFormat
для текущего потока.