关于java.util.Calendar构造函数在静态Hashtable上进行同步,我们能做些什么?

Ash*_*ash 10 java concurrency calendar

我很惊讶地看到我们的许多应用程序线程竞争在从Calendar的构造函数访问的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)
Run Code Online (Sandbox Code Playgroud)

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

....
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来操纵日期?Joda是否绕过了所有这些问题?

Emm*_*urg 1

解决方案是重用 Calendar 实例,而不是构建新实例。