2010-07-15 19 views
7

So che SimpleDateFormat e NumberFormat NON sono thread safe.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500Il thread Java MessageFormat è sicuro? (al contrario di SimpleDateFormat)

Ma che dire delle altre classi di formato come MessageFormat?

Fortify 360 segnala l'uso del metodo statico "MessageFormat.format (String, Object ...)" come problema "Condizioni di gara - Difetto di formato", ma quando analizzo il codice sorgente di MessageFormat, ho visto quello in quel metodo, crea una nuova istanza locale di MessageFormat stesso.

Il thread della classe MessageFormat Java è sicuro?

risposta

9

Il javadoc per MessageFormat dice: formati

messaggi non sono sincronizzati. Si consiglia di creare istanze di formato separate per ogni thread. Se thread multipli accede a un formato contemporaneamente, deve essere sincronizzato esternamente .

Così ufficialmente, no, non è thread-safe.

I documenti per SimpleDateFormat dicono la stessa cosa.

Ora, i documenti possono essere solo conservativi, e in pratica funzionerà bene in più thread, ma non vale il rischio.

+0

Grazie per aver mostrato il JavaDoc, sarebbe stato sufficiente per me. Quando ho visto il codice sorgente di MessageFormat, è ancora più chiaro per me perché non è thread-safe. Quella classe utilizza NumberFormat e DateFormat, due classi che non sono thread-safe. – thenonhacker

6

Se siete referrring al metodo

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

questo è thread-safe poiché, come descritto nel Javadoc crea un nuovo MessageFormat per fare la formattazione.

BTW, questo è un errore di battitura nel titolo divertente 'SimpleThreadFormat' :)

0

Per il javadoc, MessageFormat oggetti non sono thread-safe. È possibile utilizzare uno ThreadLocal per creare un oggetto separato per ogni thread che ne ha bisogno.

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

È quindi possibile utilizzare threadLocalMessageFormat.get() per ottenere un MessageFormat per il thread corrente.