diff --git a/src/share/classes/sun/util/LocaleServiceProviderPool.java b/src/share/classes/sun/util/LocaleServiceProviderPool.java index 5b6c04e883bc1b389eda7cd98619365e679a4158..c45100d75083e601102ae8940e4bd8806c2a0829 100644 --- a/src/share/classes/sun/util/LocaleServiceProviderPool.java +++ b/src/share/classes/sun/util/LocaleServiceProviderPool.java @@ -40,6 +40,7 @@ import java.util.ResourceBundle.Control; import java.util.ServiceLoader; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.spi.LocaleServiceProvider; import sun.util.logging.PlatformLogger; @@ -57,8 +58,8 @@ public final class LocaleServiceProviderPool { * A Map that holds singleton instances of this class. Each instance holds a * set of provider implementations of a particular locale sensitive service. */ - private static Map poolOfPools = - new ConcurrentHashMap(); + private static ConcurrentMap poolOfPools = + new ConcurrentHashMap<>(); /** * A Set containing locale service providers that implement the @@ -109,7 +110,7 @@ public final class LocaleServiceProviderPool { if (pool == null) { LocaleServiceProviderPool newPool = new LocaleServiceProviderPool(providerClass); - pool = poolOfPools.put(providerClass, newPool); + pool = poolOfPools.putIfAbsent(providerClass, newPool); if (pool == null) { pool = newPool; } @@ -257,10 +258,11 @@ public final class LocaleServiceProviderPool { synchronized (LocaleServiceProviderPool.class) { if (availableJRELocales == null) { Locale[] allLocales = LocaleData.getAvailableLocales(); - availableJRELocales = new ArrayList(allLocales.length); + List tmpList = new ArrayList<>(allLocales.length); for (Locale locale : allLocales) { - availableJRELocales.add(getLookupLocale(locale)); + tmpList.add(getLookupLocale(locale)); } + availableJRELocales = tmpList; } } } diff --git a/test/java/util/Locale/Bug6989440.java b/test/java/util/Locale/Bug6989440.java index ebf62f988070a499f6813914a8cf10edfccefd81..d524d05b11dfb020db55e0efcc7f39bb6e5ece54 100644 --- a/test/java/util/Locale/Bug6989440.java +++ b/test/java/util/Locale/Bug6989440.java @@ -37,26 +37,49 @@ import java.util.spi.TimeZoneNameProvider; import sun.util.LocaleServiceProviderPool; public class Bug6989440 { - public static void main(String[] args) { - TestThread t1 = new TestThread(LocaleNameProvider.class); - TestThread t2 = new TestThread(TimeZoneNameProvider.class); - TestThread t3 = new TestThread(DateFormatProvider.class); - - t1.start(); - t2.start(); - t3.start(); + static volatile boolean failed; // false + static final int THREADS = 50; + + public static void main(String[] args) throws Exception { + Thread[] threads = new Thread[THREADS]; + for (int i=0; i cls; + private static int count; public TestThread(Class providerClass) { cls = providerClass; } + public TestThread() { + int which = count++ % 3; + switch (which) { + case 0 : cls = LocaleNameProvider.class; break; + case 1 : cls = TimeZoneNameProvider.class; break; + case 2 : cls = DateFormatProvider.class; break; + default : throw new AssertionError("Should not reach here"); + } + } + public void run() { - LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls); - pool.getAvailableLocales(); + try { + LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls); + pool.getAvailableLocales(); + } catch (Exception e) { + System.out.println(e); + e.printStackTrace(); + failed = true; + } } } }