Le thread de la classe Java MessageFormat est-il sécurisé ?(contrairement à SimpleDateFormat)
-
16-09-2020 - |
Question
Je sais que SimpleDateFormat et NumberFormat ne sont PAS thread-safe.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500
Mais qu’en est-il des autres classes Format comme MessageFormat ?
Fortify 360 signale l'utilisation de la méthode statique "MessageFormat.format(String, Object...)" comme un problème "Race Condition - Format Flaw", mais lorsque j'analyse le code source de MessageFormat, j'ai vu cela dans cette méthode. , il crée une nouvelle instance locale de MessageFormat lui-même.
Le thread de la classe Java MessageFormat est-il sécurisé ?
La solution
Le javadoc pour MessageFormat
dit:
Les formats de messages ne sont pas synchronisés.Il est recommandé de créer des instances de format séparées pour chaque thread.Si plusieurs threads accèdent simultanément à un format, il doit être synchronisé à l'extérieur.
Donc officiellement, non, ce n'est pas thread-safe.
Les documents pour SimpleDateFormat
dire à peu près la même chose.
Maintenant, les documents peut soyez simplement conservateur, et dans la pratique, cela fonctionnera très bien dans plusieurs threads, mais cela n'en vaut pas la peine.
Autres conseils
Si vous vous référez à la méthode
public static String format(String pattern, Object... arguments)
Ceci est le thread-coffre-fort depuis comme décrit dans le Javadoc, il crée une nouvelle MessageFormat pour effectuer le formatage.
BTW, c'est une faute de frappe drôle dans votre titre 'SimplethreadFormat' :)
D'après le javadoc, MessageFormat
les objets ne sont pas thread-safe.Vous pouvez utiliser un ThreadLocal
pour créer un objet distinct pour chaque thread qui en a besoin.
ThreadLocal<MessageFormat> threadLocalMessageFormat =
new ThreadLocal<MessageFormat>() {
@Override
protected MessageFormat initialValue() {
return new MessageFormat(pattern);
}
};
Vous pouvez alors utiliser threadLocalMessageFormat.get()
pour obtenir un MessageFormat
pour le fil de discussion actuel.