Dokument javadoc dla SimpleDateFormat stwierdza, że SimpleDateFormat nie jest zsynchronizowany.
„Formaty dat nie są synchronizowane. Zaleca się tworzenie oddzielnych wystąpień formatu dla każdego wątku. Jeśli wiele wątków jednocześnie uzyskuje dostęp do formatu, należy go synchronizować zewnętrznie”.
Ale jakie jest najlepsze podejście do korzystania z wystąpienia SimpleDateFormat w środowisku wielowątkowym. Oto kilka opcji, o których myślałem. W przeszłości korzystałem z opcji 1 i 2, ale jestem ciekawy, czy istnieją lepsze alternatywy lub która z tych opcji zapewniłaby najlepszą wydajność i współbieżność.
Opcja 1: w razie potrzeby utwórz wystąpienia lokalne
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Opcja 2: Utwórz wystąpienie SimpleDateFormat jako zmienną klasową, ale zsynchronizuj do niej dostęp.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Opcja 3: Utwórz ThreadLocal, aby przechowywać różne wystąpienie SimpleDateFormat dla każdego wątku.
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);
}