diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2017-02-13 08:55:41 -0500 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2017-02-13 08:55:41 -0500 |
commit | b81309bb312ce02a437bc9b12ab80e6071afa3cf (patch) | |
tree | a49d73ee3142083ccd7d47448a887e13a000dc59 /nailgun_launcher/CbtURLClassLoader.java | |
parent | b26114e16e7654f34f4e07be25aaad9839ef81a4 (diff) | |
download | cbt-b81309bb312ce02a437bc9b12ab80e6071afa3cf.tar.gz cbt-b81309bb312ce02a437bc9b12ab80e6071afa3cf.tar.bz2 cbt-b81309bb312ce02a437bc9b12ab80e6071afa3cf.zip |
fix deadlock in class loading cache
Diffstat (limited to 'nailgun_launcher/CbtURLClassLoader.java')
-rw-r--r-- | nailgun_launcher/CbtURLClassLoader.java | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/nailgun_launcher/CbtURLClassLoader.java b/nailgun_launcher/CbtURLClassLoader.java index bf698b0..10add77 100644 --- a/nailgun_launcher/CbtURLClassLoader.java +++ b/nailgun_launcher/CbtURLClassLoader.java @@ -15,7 +15,7 @@ public class CbtURLClassLoader extends java.net.URLClassLoader{ + "\n)" ); } - ConcurrentHashMap<String,Class> cache = new ConcurrentHashMap<String,Class>(); + ConcurrentHashMap<Object,Object> cache = new ConcurrentHashMap<Object,Object>(); public Class loadClass(String name) throws ClassNotFoundException{ Class _class = super.loadClass(name); if(_class == null) throw new ClassNotFoundException(name); @@ -25,12 +25,18 @@ public class CbtURLClassLoader extends java.net.URLClassLoader{ //System.out.println("loadClass("+name+") on \n"+this); synchronized( cache ){ if(!cache.containsKey(name)) + cache.put(name, new Object()); + } + Object key = cache.get(name); + synchronized( key ){ + if(!cache.containsKey(key)){ try{ - cache.put(name, super.loadClass(name, resolve)); + cache.put(key, super.loadClass(name, resolve)); } catch (ClassNotFoundException e){ - cache.put(name, Object.class); + cache.put(key, Object.class); } - Class _class = cache.get(name); + } + Class _class = (Class) cache.get(key); if(_class == Object.class){ if( name.equals("java.lang.Object") ) return Object.class; |