मैं अपने कई ऐप थ्रेड को java.util.Hashtable.get (xx) विधि पर सिंक्रनाइज़ करने के लिए प्रतिस्पर्धा करने के लिए डर गया था जो कैलेंडर के कन्स्ट्रक्टर से प्राप्त हो जाता है।हम java.util.Calendar कन्स्ट्रक्टर के बारे में क्या कर सकते हैं एक स्थिर हैशटेबल पर सिंक्रनाइज़ करना?
at java.util.Hashtable.get(java.lang.Object)
at java.util.Calendar.setWeekCountData(java.util.Locale)
at java.util.Calendar.<init>(java.util.TimeZone, java.util.Locale)
at java.util.GregorianCalendar.<init>(java.util.TimeZone, java.util.Locale)
ctor एक स्थिर hashtable कि एक कैश के रूप में सेवा करने के लिए है ऊपर दिखता है, लेकिन अवरुद्ध सभी थ्रेड समाप्त होता है।
/**
* Cache to hold the firstDayOfWeek and minimalDaysInFirstWeek
* of a Locale.
*/
private static Hashtable<Locale, int[]> cachedLocaleData = new Hashtable<Locale, int[]>(3);
protected Calendar(TimeZone zone, Locale aLocale)
{
.. .. snip ..
setWeekCountData(aLocale);
}
private void setWeekCountData(Locale desiredLocale)
{
/* try to get the Locale data from the cache */
int[] data = cachedLocaleData.get(desiredLocale);
....
}
क्या तारीखों में हेरफेर करने का कोई बेहतर तरीका है? क्या Joda इन सभी मुद्दों को बाईपास करता है?
सबसे अच्छा जवाब, इस मामले में, java.util.Calendar के बजाय [जोडा-टाइम] (http://joda-time.sourceforge.net/) का उपयोग करना है। जोडा-टाइम एक ओपन सोर्स कैलेंडर प्रतिस्थापन है जो दिनांक/कैलेंडर में बड़ी मात्रा में समस्याओं को हल करता है। अफसोस की बात है, इसका मतलब यह है कि धागे से संबंधित सभी कोड को फिर से लिखना, या कम से कम, हॉट स्पॉट्स में जहां आप विवाद से पीड़ित हैं। – Barend
ऐसा प्रतीत होता है कि सूर्य मंचों पर एक बग पोस्टिंग भी है - https://forums.oracle.com/forums/thread.jspa?threadID=834143 –