2011-11-11 2 views
10

Ero inorridito nel vedere molti dei nostri thread di app in competizione per la sincronizzazione su un metodo java.util.Hashtable.get (xx) a cui si accede dal costruttore del calendario.Cosa possiamo fare per la sincronizzazione del costruttore java.util.Calendar su una Hashtable statica?

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) 

Il Ctor cerca una tabella hash statica che deve essere utilizzata come cache, ma che blocca tutti i thread.

/** 
* 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); 

.... 
} 

C'è un modo migliore per modificare le date? Joda ignora tutti questi problemi?

+1

La risposta migliore, in questo caso, è utilizzare [Joda-Time] (http://joda-time.sourceforge.net/) anziché java.util.Calendar. Joda-Time è un sostituto del calendario open source che risolve un'enorme quantità di problemi in Data/Calendario. Purtroppo, ciò significa riscrivere tutto il codice che riguarda i thread, o almeno, nei punti caldi in cui si soffre di conflitto. – Barend

+0

Sembra che ci sia anche una segnalazione di bug sui forum di Sun - https://forums.oracle.com/forums/thread.jspa?threadID=834143 –

risposta

1

Una soluzione è riutilizzare le istanze di Calendar invece di costruirne di nuove.

4

Soluzione migliore, utilizzare Java 7, lo Hashtable è stato sostituito da uno ConcurrentMap.

1

Forse la soluzione più semplice (oltre all'aggiornamento dell'implementazione sottostante) consiste nell'utilizzare un'istanza di prototipo e clone.