La cassaforte della classe Java Messageformat è sicura?(Al contrario di SimpleDateFormat)
-
16-09-2020 - |
Domanda
So che SimpleDateFormat e NumberFormat non sono al thread sicuro.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
Ma per quanto riguarda le altre classi di formato come MessageFormat?
Fortificare 360 stallando l'uso di "MessageFormat.Format (String, Object ...)" Metodo statico come problema "Condizioni di gara - Formato formato", ma quando analizzo il codice sorgente di Messageformat, l'ho vistoIn quel metodo, crea una nuova istanza locale di MessageFormat stesso.
è il thread della classe Java MessageFormat sicuro?
Soluzione
the javadoc per MessageFormat
dice:
.I formati di messaggi non sono sincronizzati. Si consiglia di creare separati Formattare le istanze per ogni thread.Se thread multipli accedono a un formato Continente, deve essere sincronizzato esternamente.
Così ufficialmente, no - non è al sicuro.
I documenti per SimpleDateFormat
dicono molto la stessa cosa.
Ora, i documenti maggio essere conservativi, e in pratica funzionerà bene in più fili, ma non vale il rischio.
Altri suggerimenti
Se si sta preferendo al metodo
public static String format(String pattern, Object... arguments)
.
Questo è cassaforte dal thread poiché come descritto in Javadoc crea un nuovo MessageFormat per fare la formattazione.
btw, questo è un tipo di battitura divertente nel titolo 'SimplethreadFormat' :)
per javadoc, MessageFormat
Gli oggetti non sono al sicuro.È possibile utilizzare un ThreadLocal
per creare unoggetto separato per ogni filo 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 filo corrente.