SimpleDateFormat için javadoc, SimpleDateFormat'ın senkronize edilmediğini belirtir.
"Tarih biçimleri senkronize edilmez. Her iş parçacığı için ayrı biçim örnekleri oluşturulması önerilir. Birden çok iş parçacığı bir biçime aynı anda erişirse, dışarıdan eşitlenmelidir."
Ancak, çok iş parçacıklı bir ortamda SimpleDateFormat örneğini kullanmak için en iyi yaklaşım nedir? İşte düşündüğüm birkaç seçenek, geçmişte 1. ve 2. seçenekleri kullandım ancak daha iyi alternatifler olup olmadığını veya bu seçeneklerden hangisinin en iyi performansı ve eşzamanlılığı sunacağını merak ediyorum.
1. Seçenek: Gerektiğinde yerel örnekler oluşturun
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Seçenek 2: Sınıf değişkeni olarak SimpleDateFormat örneğini oluşturun, ancak buna erişimi senkronize edin.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Seçenek 3: Her iş parçacığı için farklı bir SimpleDateFormat örneği depolamak için bir ThreadLocal oluşturun.
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);
}