SimpleDateFormat के लिए javadoc बताता है कि 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: प्रत्येक थ्रेड के लिए SimpleDateFormat का एक अलग उदाहरण संग्रहीत करने के लिए एक ThreadLocal बनाएँ।
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);
}