Das Javadoc für SimpleDateFormat gibt an, dass SimpleDateFormat nicht synchronisiert ist.
"Datumsformate werden nicht synchronisiert. Es wird empfohlen, separate Formatinstanzen für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden."
Was ist jedoch der beste Ansatz für die Verwendung einer Instanz von SimpleDateFormat in einer Umgebung mit mehreren Threads? Hier sind einige Optionen, an die ich gedacht habe: Ich habe in der Vergangenheit die Optionen 1 und 2 verwendet, bin aber gespannt, ob es bessere Alternativen gibt oder welche dieser Optionen die beste Leistung und Parallelität bieten.
Option 1: Erstellen Sie bei Bedarf lokale Instanzen
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Option 2: Erstellen Sie eine Instanz von SimpleDateFormat als Klassenvariable, synchronisieren Sie jedoch den Zugriff darauf.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Option 3: Erstellen Sie ein ThreadLocal, um für jeden Thread eine andere Instanz von SimpleDateFormat zu speichern.
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}