В javadoc для SimpleDateFormat указано, что 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);
}
+1 для поднятия этого вопроса. Так много людей думают, что SimpleDateFormat является потокобезопасным (я вижу допущения везде). –
Для получения дополнительной информации о подходе ThreadLocal см .: http://www.javaspecialists.eu/archive/Issue172.html – miner49r
И для чего, см. Этот вопрос: http://stackoverflow.com/questions/6840803/simpledateformat- thread-safety – Raedwald