Es scheinen ein relativ weit verbreitetes Missverständnis zu existieren, dass die Klasse java.text.SimpleDateFormat thead-sicher ist. Dies ist nicht korrekt, denn zumindest die Methode „format()“ verändert den Zustand der Instanz. In JavaDoc von java.text.SimpleDateFormat heißt es:
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
Vorschläge zur Lösung des Problems:
- Aufrufe der Methode „format()“ synchronisieren. Dies könnte z.B. durch die Implementierung einer Wrapper-Klasse erfolgen.
- Joda Time Framework verwenden. Die Klasse org.joda.time.format.DateTimeFormat ist thread-sicher and immutable.
- Thread-Local verwenden wie z.B.:
private final static ThreadLocal<SimpleDateFormat> shortTimeFormat =
new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
}
};
Achtung: Generell sollte man bei Verwendung von ThreadLocal sehr vorsichtig sein. Insbesondere wenn in der Anwendung Thread-Pools zum Einsatz kommen. Variablen, die in ThreadLocal abgelegt werden, werden vom Garbage Collector nicht bereinigt und sind auch für andere Threads sichtbar. Dies ist kann ein potentielles Sicherheitsproblem sein. In diesem Fall sehe ich jedoch kein Problem.



Letzte Kommentare