Что мы можем сделать с конструктором java.util.Calendar, синхронизирующимся со статической Hashtable?

Я был в ужасе, увидев, что многие из наших потоков приложений конкурируют за синхронизацию с методом java.util.Hashtable.get (xx), доступ к которому осуществляется из конструктора Calendar .

at java.util.Hashtable.get(java.lang.Object)
at java.util.Calendar.setWeekCountData(java.util.Locale)
at java.util.Calendar.(java.util.TimeZone, java.util.Locale)
at java.util.GregorianCalendar.(java.util.TimeZone, java.util.Locale)

ctor ищет статическую хеш-таблицу, которая предназначена для использования в качестве кеша, но в конечном итоге блокирует все потоки.

/**
 * Cache to hold the firstDayOfWeek and minimalDaysInFirstWeek
 * of a Locale.
 */
private static Hashtable cachedLocaleData = new Hashtable(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 обойти все эти проблемы?

10
задан JodaStephen 22 August 2013 в 11:51
поделиться