Что мы можем сделать с синхронизатором конструктора java.util.Calendar на статической Hashtable? - PullRequest
10 голосов
/ 12 ноября 2011

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

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 ищет статическую хеш-таблицу, которая должна служить кешем, но в итоге блокирует все потоки.

/**
 * 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 обходит все эти проблемы?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

Лучшее решение, используйте Java 7, Hashtable был заменен на ConcurrentMap.

1 голос
/ 12 ноября 2011

Возможно, самое простое решение (кроме обновления базовой реализации) - использовать экземпляр прототипа и clone it.

1 голос
/ 12 ноября 2011

Решение состоит в том, чтобы повторно использовать экземпляры Calendar вместо создания новых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...