252 votes

Sécurité des threads SimpleDateFormat

S’il vous plaît dire avec un exemple de code est pourquoi SimpleDateFormat pas thread-safe. Quel est le problème dans cette classe ? Le problème avec la fonction format de SimpleDateFormat? S’il vous plaît donner un code qui illustre cette faille en classe.

FastDateFormat est thread-safe. Pourquoi ? Quelle est la différence b/w le SimpleDateFormat et FastDateFormat ?

S’il vous plaît expliquer avec un code qui illustre ce problème ?

263voto

Bozho Points 273663

SimpleDateFormat magasins les résultats intermédiaires dans des champs d'instance. Donc, si une instance est utilisé par les deux threads ils peuvent mess des uns et des autres résultats.

En regardant le code source révèle qu'il y a un Calendar champ d'instance, qui est utilisé par les opérations sur DateFormat / SimpleDateFormat

Par exemple parse(..) des appels calendar.clear() d'abord, puis calendar.add(..). Si un autre thread invoque parse(..) avant la fin de la première invocation, il sera clairement le calendrier, mais l'autre invocation, s'attendent à être rempli avec des résultats intermédiaires du calcul.

Une façon de réutiliser les formats de date sans fil-sécurité est de les placer dans un ThreadLocal - certaines bibliothèques le faire. C'est si vous avez besoin d'utiliser le même format plusieurs fois dans un seul thread. Mais dans le cas où vous utilisez un conteneur de servlet (qui a un pool de threads), n'oubliez pas de nettoyer le fil des locaux après que vous avez terminé.

Pour être honnête, je ne comprends pas pourquoi ils ont besoin de l'exemple de champ, mais c'est la façon dont il est. Vous pouvez également utiliser joda-time DateTimeFormat qui est thread-safe.

65voto

99tm Points 19742

SimpleDateFormat est une classe concrète pour la mise en forme et l'analyse des dates dans les paramètres régionaux de manière sensible.

De la JavaDoc,

Mais les formats de Date sont pas synchronisés. Il est recommandé de créer format distinct des instances pour chaque thread. Si plusieurs threads accèdent un format simultanément, it must be synchronized externally.

Pour faire la classe SimpleDateFormat thread-safe, regardez les approches suivantes :

  • Créer un nouveau SimpleDateFormat exemple à chaque fois que vous devez utiliser. Bien que ce n'est pas thread-safe, c'est la plus lente possible d'approche.
  • Utilisation de la synchronisation. C'est une mauvaise idée parce que vous ne devriez jamais point d'étranglement de votre fils sur un serveur.
  • Utiliser un ThreadLocal. C'est le plus rapide approche de la 3 (voir http://www.javacodegeeks.com/2010/07/java-best-practices-dateformat-in.html).

34voto

Pablo Moretti Points 465

ThreadLocal + SimpleDateFormat = SimpleDateFormatThreadSafe

https://GIST.github.com/pablomoretti/9748230

15voto

dma_k Points 3567

Version 3.2 du auront de classe qui est un substitut de thread-safe de pour le calendrier grégorien. Voir [ ](https://issues.apache.org/jira/browse/LANG-909) pour plus d’informations.

3voto

hstoerr Points 5771

Voici un exemple de code qui prouve la faute dans la classe. J’ai vérifié : le problème se produit lorsque vous utilisez parse et également lorsque vous utilisez uniquement format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X