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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top