Что мы можем сделать с java.util.Синхронизация конструктора календаря со статической хеш-таблицей?

#java #concurrency #calendar

#java #параллелизм #Календарь

Вопрос:

Я был в ужасе, увидев, что многие из наших потоков приложений конкурируют за синхронизацию с 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 все эти проблемы?

Комментарии:

1. Лучший ответ в этом случае — использовать Joda-Time вместо java.util. Календарь. Joda-Time — это замена календаря с открытым исходным кодом, которая устраняет огромное количество проблем с датой / календарем. К сожалению, это означает переписывание всего кода, который имеет дело с потоками, или, по крайней мере, в горячих точках, где вы страдаете от конфликтов.

2. Похоже, что на форумах Sun также опубликована ошибка — forums.oracle.com/forums/thread.jspa?threadID=834143

Ответ №1:

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

Ответ №2:

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

Ответ №3:

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