Le thread de la classe Java MessageFormat est-il sécurisé ?(contrairement à SimpleDateFormat)

StackOverflow https://stackoverflow.com/questions/3257068

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é ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top