--- a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java Mon Apr 24 13:43:34 2017 +0800
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java Thu May 04 07:26:55 2017 +0000
@@ -172,12 +172,10 @@
}
/**
- * Register a module this this class loader. This has the effect of making
- * the types in the module visible.
+ * Register a module this class loader. This has the effect of making the
+ * types in the module visible.
*/
public void loadModule(ModuleReference mref) {
- assert !VM.isModuleSystemInited();
-
String mn = mref.descriptor().name();
if (nameToModule.putIfAbsent(mn, mref) != null) {
throw new InternalError(mn + " already defined to this loader");
@@ -191,6 +189,11 @@
+ other.mref().descriptor().name());
}
}
+
+ // clear resources cache if VM is already initialized
+ if (VM.isModuleSystemInited() && resourceCache != null) {
+ resourceCache = null;
+ }
}
/**
@@ -355,7 +358,10 @@
private List<URL> findMiscResource(String name) throws IOException {
SoftReference<Map<String, List<URL>>> ref = this.resourceCache;
Map<String, List<URL>> map = (ref != null) ? ref.get() : null;
- if (map != null) {
+ if (map == null) {
+ map = new ConcurrentHashMap<>();
+ this.resourceCache = new SoftReference<>(map);
+ } else {
List<URL> urls = map.get(name);
if (urls != null)
return urls;
@@ -381,23 +387,18 @@
}
}
}
- return result;
+ return (result != null) ? result : Collections.emptyList();
}
});
} catch (PrivilegedActionException pae) {
throw (IOException) pae.getCause();
}
- // only cache resources after all modules have been defined
+ // only cache resources after VM is fully initialized
if (VM.isModuleSystemInited()) {
- if (map == null) {
- map = new ConcurrentHashMap<>();
- this.resourceCache = new SoftReference<>(map);
- }
- if (urls == null)
- urls = Collections.emptyList();
map.putIfAbsent(name, urls);
}
+
return urls;
}