Il javadoc per SimpleDateFormat indica che SimpleDateFormat non è sincronizzato.
"I formati della data non sono sincronizzati. Si consiglia di creare istanze di formato separate per ogni thread. Se più thread accedono a un formato contemporaneamente, è necessario sincronizzarlo esternamente."
Ma qual è l'approccio migliore per utilizzare un'istanza di SimpleDateFormat in un ambiente con più thread. Ecco alcune opzioni a cui ho pensato, ho utilizzato le opzioni 1 e 2 in passato, ma sono curioso di sapere se ci sono alternative migliori o quale di queste opzioni offrirebbe le migliori prestazioni e concorrenza.
Opzione 1: creare istanze locali quando necessario
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Opzione 2: creare un'istanza di SimpleDateFormat come variabile di classe ma sincronizzare l'accesso ad essa.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Opzione 3: creare un ThreadLocal per archiviare un'istanza diversa di SimpleDateFormat per ogni thread.
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);
}