diff -r 303c8cca4a31 -r 859aa05172b6 jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java --- a/jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java Fri Oct 08 09:50:56 2010 +0900 +++ b/jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java Tue Oct 12 17:09:14 2010 -0700 @@ -84,7 +84,7 @@ * static. This could be non-static later, so that they could have * different sets for each locale sensitive services. */ - private static List availableJRELocales = null; + private static volatile List availableJRELocales = null; /** * Provider locales for this locale sensitive service. @@ -252,12 +252,16 @@ * * @return list of the available JRE locales */ - private synchronized List getJRELocales() { + private List getJRELocales() { if (availableJRELocales == null) { - Locale[] allLocales = LocaleData.getAvailableLocales(); - availableJRELocales = new ArrayList(allLocales.length); - for (Locale locale : allLocales) { - availableJRELocales.add(getLookupLocale(locale)); + synchronized (LocaleServiceProviderPool.class) { + if (availableJRELocales == null) { + Locale[] allLocales = LocaleData.getAvailableLocales(); + availableJRELocales = new ArrayList(allLocales.length); + for (Locale locale : allLocales) { + availableJRELocales.add(getLookupLocale(locale)); + } + } } } return availableJRELocales;