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.