Ist der Thread der Java MessageFormat-Klasse sicher?(im Gegensatz zu SimpleDateFormat)
-
16-09-2020 - |
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?
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.