Frage

Ich weiß, dass SimpleDateFormat und NumberFormat NICHT Thread-sicher sind.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500

Aber was ist mit den anderen Formatklassen wie MessageFormat?

Fortify 360 markiert die Verwendung der statischen Methode „MessageFormat.format(String, Object...)“ als „Race Condition – Format Flaw“-Problem, aber als ich den Quellcode von MessageFormat analysierte, sah ich das in dieser Methode erstellt es eine neue lokale Instanz von MessageFormat selbst.

Ist der Thread der Java MessageFormat-Klasse sicher?

War es hilfreich?

Lösung

Der Javadoc für MessageFormat sagt:

Nachrichtenformate werden nicht synchronisiert.Für jeden Thread wird empfohlen, separate Formatinstanzen zu erstellen.Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden.

Also offiziell nein – es ist nicht threadsicher.

Die Dokumente für SimpleDateFormat sage im Großen und Ganzen das Gleiche.

Nun zu den Dokumenten Mai Seien Sie einfach konservativ, und in der Praxis funktioniert es in mehreren Threads einwandfrei, aber das Risiko ist es nicht wert.

Andere Tipps

Wenn Sie auf das Verfahren Bezug genommen werden

generasacodicetagpre.

Dies ist Thread-Safe seitdem wie in der Javadoc beschrieben, erzeugt es eine neue MessageFormat, um die Formatierung zu erledigen.

BTW, das ist ein lustiger Tippfehler in Ihrem Titel "SimpleThreadFormat" :)

Laut Javadoc, MessageFormat Objekte sind nicht threadsicher.Sie können a verwenden ThreadLocal um für jeden Thread, der eines benötigt, ein separates Objekt zu erstellen.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top