Index: DefaultRMIClassLoaderSpi.java =================================================================== --- DefaultRMIClassLoaderSpi.java (revision 452881) +++ DefaultRMIClassLoaderSpi.java (working copy) @@ -68,6 +68,9 @@ // table holding list of URLLoader-s private static Hashtable table = new Hashtable(); + + // Object for synchronization of new URLLoader-s creation process. + private static Object lock = new Object(); static { String codebaseVal = (String) AccessController.doPrivileged( @@ -445,8 +448,13 @@ } TableKey key = new TableKey(parentLoader, codebase); URLLoader loader = null; + boolean hasLoader = false; - if (table.containsKey(key)) { + synchronized(lock) { + hasLoader = table.containsKey(key); + } + + if (hasLoader) { loader = (URLLoader) ((WeakReference) table.get(key)).get(); if (loader == null) { @@ -458,25 +466,28 @@ return loader; } } - AccessControlContext ctx = createLoaderACC(key.getURLs()); - // PrivilegedAction for URLLoader creation - class CreateLoaderAction implements PrivilegedAction { - URL[] urls; - ClassLoader parentLoader; + synchronized (lock) { + AccessControlContext ctx = createLoaderACC(key.getURLs()); - public CreateLoaderAction(URL[] urls, ClassLoader parentLoader) { - this.urls = urls; - this.parentLoader = parentLoader; - } + // PrivilegedAction for URLLoader creation + class CreateLoaderAction implements PrivilegedAction { + URL[] urls; + ClassLoader parentLoader; - public Object run() { - return new URLLoader(urls, parentLoader); + public CreateLoaderAction(URL[] urls, ClassLoader parentLoader) { + this.urls = urls; + this.parentLoader = parentLoader; + } + + public Object run() { + return new URLLoader(urls, parentLoader); + } } + loader = (URLLoader) AccessController.doPrivileged( + new CreateLoaderAction(key.getURLs(), parentLoader), ctx); + table.put(key, new WeakReference(loader)); } - loader = (URLLoader) AccessController.doPrivileged( - new CreateLoaderAction(key.getURLs(), parentLoader), ctx); - table.put(key, new WeakReference(loader)); if (loader != null) { loader.checkPermissions();