El javadoc para SimpleDateFormat indica que SimpleDateFormat no está sincronizado.Sincronización de acceso a SimpleDateFormat
"Los formatos de fecha no están sincronizadas. Se se recomienda crear instancias formato separados para cada hilo. Si múltiples subprocesos tienen acceso a un formato al mismo tiempo, debe ser sincronizado externamente."
Pero, ¿cuál es el mejor enfoque para utilizar una instancia de SimpleDateFormat en un entorno de múltiples hilos. Aquí hay algunas opciones en las que he pensado, he utilizado las opciones 1 y 2 en el pasado, pero tengo curiosidad por saber si hay alternativas mejores o cuáles de estas opciones ofrecerían el mejor rendimiento y concurrencia.
Opción 1: Crear instancias locales cuando se requiere
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Opción 2: Crear una instancia de SimpleDateFormat como una variable de clase pero sincronizar el acceso a la misma.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Opción 3: Cree un ThreadLocal para almacenar una instancia diferente de SimpleDateFormat para cada subproceso.
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);
}
+1 para plantear esta cuestión. Mucha gente piensa que SimpleDateFormat es seguro para subprocesos (veo suposiciones en todas partes). –
Para obtener más información sobre el enfoque ThreadLocal, consulte: http://www.javaspecialists.eu/archive/Issue172.html – miner49r
Y para obtener más información, consulte esta pregunta: http://stackoverflow.com/questions/6840803/simpledateformat- seguridad de hilos – Raedwald