From b81309bb312ce02a437bc9b12ab80e6071afa3cf Mon Sep 17 00:00:00 2001 From: Christopher Vogt Date: Mon, 13 Feb 2017 08:55:41 -0500 Subject: fix deadlock in class loading cache --- nailgun_launcher/CbtURLClassLoader.java | 14 ++++++++++---- 1 file 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 cache = new ConcurrentHashMap(); + ConcurrentHashMap cache = new ConcurrentHashMap(); 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; -- cgit v1.2.3