2010-07-15 5 views
7

Ich weiß, dass SimpleDateFormat und NumberFormat nicht Thread sicher sind.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500Ist der Java MessageFormat-Klassen-Thread sicher? (im Gegensatz zu SimpleDateFormat)

Aber was ist mit den anderen Format-Klassen wie MessageFormat?

Fortify 360 markiert die Verwendung der statischen Methode "MessageFormat.format (String, Object ...)" als "Race Condition - Format Fehler" Problem, aber wenn ich den Quellcode von MessageFormat analysieren, sah ich dass in dieser Methode eine neue lokale Instanz von MessageFormat selbst erstellt wird.

Ist die Java MessageFormat-Klasse sicher?

Antwort

9

Die javadoc für MessageFormat sagt:

Nachrichtenformate nicht synchronisiert sind. Es wird empfohlen, separate Instanzen des Formats für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden.

Also offiziell, nein - es ist nicht Thread-sicher.

Die Dokumente für SimpleDateFormat sagen viel die gleiche Sache.

Nun kann die Doku nur konservativ sein, und in der Praxis wird es in mehreren Threads gut funktionieren, aber es ist das Risiko nicht wert.

+0

Vielen Dank für die JavaDoc, das wäre genug für mich. Als ich den Quelltext von MessageFormat gesehen habe, ist es für mich noch klarer, warum es nicht threadsicher ist. Diese Klasse verwendet NumberFormat und DateFormat, zwei Klassen, die nicht threadsicher sind. – thenonhacker

6

Wenn Sie die Methode

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

dies ist Thread-sicher, da, wie in der javadoc beschrieben referrring es einen neuen Message schafft die Formatierung zu tun.

BTW, das ist ein lustigen Tippfehler im Titel 'SimpleThreadFormat' :)

0

Per javadoc, MessageFormat Objekte sind nicht Thread-sicher. Sie können ein ThreadLocal verwenden, um ein separates Objekt für jeden Thread zu erstellen, der einen benötigt.

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

Sie können dann threadLocalMessageFormat.get() verwenden, um ein MessageFormat für den aktuellen Thread zu erhalten.