2011-11-11 11 views
10

मैं अपने कई ऐप थ्रेड को 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 इन सभी मुद्दों को बाईपास करता है?

+1

सबसे अच्छा जवाब, इस मामले में, java.util.Calendar के बजाय [जोडा-टाइम] (http://joda-time.sourceforge.net/) का उपयोग करना है। जोडा-टाइम एक ओपन सोर्स कैलेंडर प्रतिस्थापन है जो दिनांक/कैलेंडर में बड़ी मात्रा में समस्याओं को हल करता है। अफसोस की बात है, इसका मतलब यह है कि धागे से संबंधित सभी कोड को फिर से लिखना, या कम से कम, हॉट स्पॉट्स में जहां आप विवाद से पीड़ित हैं। – Barend

+0

ऐसा प्रतीत होता है कि सूर्य मंचों पर एक बग पोस्टिंग भी है - https://forums.oracle.com/forums/thread.jspa?threadID=834143 –

उत्तर

1

एक समाधान नए बनाने के बजाय कैलेंडर उदाहरणों का पुन: उपयोग करना है।

4

बेहतर समाधान, जावा 7 का उपयोग करें, Hashtable को ConcurrentMap द्वारा प्रतिस्थापित किया गया है।

1

शायद सबसे आसान समाधान (अंतर्निहित कार्यान्वयन को अपग्रेड करने के अलावा) प्रोटोटाइप उदाहरण और clone का उपयोग करना है।

संबंधित मुद्दे