У 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);
}