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?
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
Sembra che ci sia anche una segnalazione di bug sui forum di Sun - https://forums.oracle.com/forums/thread.jspa?threadID=834143 –