Javadoc untuk SimpleDateFormat menyatakan bahwa SimpleDateFormat tidak disinkronkan.
"Format tanggal tidak disinkronkan. Disarankan untuk membuat contoh format terpisah untuk setiap utas. Jika beberapa utas mengakses format secara bersamaan, itu harus disinkronkan secara eksternal."
Tapi apa pendekatan terbaik untuk menggunakan instance SimpleDateFormat di lingkungan multi threaded. Berikut adalah beberapa opsi yang telah saya pikirkan, saya telah menggunakan opsi 1 dan 2 di masa lalu, tetapi saya ingin tahu apakah ada alternatif yang lebih baik atau opsi mana yang menawarkan kinerja dan konkurensi terbaik.
Opsi 1: Buat instance lokal saat diperlukan
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Opsi 2: Buat instance SimpleDateFormat sebagai variabel kelas tetapi akses sinkronisasinya.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Opsi 3: Buat ThreadLocal untuk menyimpan instance SimpleDateFormat yang berbeda untuk setiap utas.
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);
}