O thread da classe Java MessageFormat é seguro?(em oposição a SimpleDateFormat)
-
16-09-2020 - |
Pergunta
Eu sei que SimpleDateFormat e NumberFormat NÃO são thread-safe.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
Mas e as outras classes Format como MessageFormat?
O Fortify 360 está sinalizando o uso do método estático "MessageFormat.format(String, Object...)" como um problema de "Condição de corrida - falha de formato", mas quando analisei o código-fonte do MessageFormat, vi isso nesse método , ele cria uma nova instância local do próprio MessageFormat.
O thread da classe Java MessageFormat é seguro?
Solução
o javadoc Para a MessageFormat
:
.Os formatos de mensagem não são sincronizados. Recomenda-se criar Formatar instâncias para cada linha.Se Vários segmentos acessam um formato simultaneamente, deve ser sincronizado externamente.
tão oficialmente, não - não é seguro.
Os documentos para SimpleDateFormat
dizem a mesma coisa.
Agora, os documentos podem apenas ser conservador, e na prática, ele funciona bem em vários tópicos, mas não vale a pena o risco.
Outras dicas
Se você está se referindo ao método
public static String format(String pattern, Object... arguments)
isso é seguro para threads, pois conforme descrito no javadoc, ele cria um novo MessageFormat para fazer a formatação.
Aliás, isso é um erro de digitação engraçado no seu título 'SimpleThreadFormat' :)
De acordo com o javadoc, MessageFormat
objetos não são thread-safe.Você pode usar um ThreadLocal
para criar um objeto separado para cada thread que precisa de um.
ThreadLocal<MessageFormat> threadLocalMessageFormat =
new ThreadLocal<MessageFormat>() {
@Override
protected MessageFormat initialValue() {
return new MessageFormat(pattern);
}
};
Você pode então usar threadLocalMessageFormat.get()
para obter um MessageFormat
para o tópico atual.