O javadoc para SimpleDateFormat afirma que SimpleDateFormat não está sincronizado.
"Os formatos de data não são sincronizados. É recomendado criar instâncias de formato separadas para cada thread. Se vários threads acessarem um formato simultaneamente, ele deve ser sincronizado externamente."
Mas qual é a melhor abordagem para usar uma instância de SimpleDateFormat em um ambiente multiencadeado. Aqui estão algumas opções que pensei, usei as opções 1 e 2 no passado, mas estou curioso para saber se há alternativas melhores ou qual dessas opções ofereceria o melhor desempenho e simultaneidade.
Opção 1: criar instâncias locais quando necessário
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Opção 2: crie uma instância de SimpleDateFormat como uma variável de classe, mas sincronize o acesso a ela.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Opção 3: Crie um ThreadLocal para armazenar uma instância diferente de SimpleDateFormat para cada 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);
}