Javadoc для SimpleDateFormat утверждает, что SimpleDateFormat не синхронизирован.
"Форматы даты не синхронизированы.
рекомендуется создать отдельный
форматировать экземпляры для каждого потока. Если
несколько потоков обращаются к формату
одновременно он должен быть синхронизирован
внешне. "
Но каков наилучший подход к использованию экземпляра SimpleDateFormat в многопоточной среде. Вот несколько вариантов, о которых я подумал. Я использовал варианты 1 и 2 в прошлом, но мне любопытно узнать, есть ли более лучшие альтернативы или какой из этих вариантов обеспечит наилучшую производительность и параллелизм.
Вариант 1. Создание локальных экземпляров при необходимости
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Вариант 2: Создать экземпляр SimpleDateFormat в качестве переменной класса, но синхронизировать доступ к нему.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Вариант 3: Создать ThreadLocal для хранения разных экземпляров SimpleDateFormat для каждого потока.
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);
}