diff -r 33fec5f9630b -r 7af2d7a87806 jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Sun Jan 13 19:57:06 2013 -0500 +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java Mon Jan 14 11:09:53 2013 -0800 @@ -37,6 +37,8 @@ import java.util.Locale; import java.util.ResourceBundle; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.spi.CalendarDataProvider; import java.util.spi.CalendarNameProvider; import java.util.spi.CurrencyNameProvider; @@ -44,7 +46,6 @@ import java.util.spi.LocaleServiceProvider; import java.util.spi.TimeZoneNameProvider; import sun.util.cldr.CLDRLocaleProviderAdapter; -import sun.util.resources.LocaleData; /** * The LocaleProviderAdapter abstract class. @@ -119,6 +120,12 @@ */ private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null; + /** + * Adapter lookup cache. + */ + private static ConcurrentMap, ConcurrentMap> + adapterCache = new ConcurrentHashMap<>(); + static { String order = AccessController.doPrivileged( new sun.security.action.GetPropertyAction("java.locale.providers")); @@ -210,9 +217,23 @@ */ public static LocaleProviderAdapter getAdapter(Class providerClass, Locale locale) { + LocaleProviderAdapter adapter; + + // cache lookup + ConcurrentMap adapterMap = adapterCache.get(providerClass); + if (adapterMap != null) { + if ((adapter = adapterMap.get(locale)) != null) { + return adapter; + } + } else { + adapterMap = new ConcurrentHashMap<>(); + adapterCache.putIfAbsent(providerClass, adapterMap); + } + // Fast look-up for the given locale - LocaleProviderAdapter adapter = findAdapter(providerClass, locale); + adapter = findAdapter(providerClass, locale); if (adapter != null) { + adapterMap.putIfAbsent(locale, adapter); return adapter; } @@ -226,11 +247,13 @@ } adapter = findAdapter(providerClass, loc); if (adapter != null) { + adapterMap.putIfAbsent(locale, adapter); return adapter; } } // returns the adapter for FALLBACK as the last resort + adapterMap.putIfAbsent(locale, fallbackLocaleProviderAdapter); return fallbackLocaleProviderAdapter; } @@ -398,7 +421,5 @@ public abstract LocaleResources getLocaleResources(Locale locale); - public abstract LocaleData getLocaleData(); - public abstract Locale[] getAvailableLocales(); }