static AccessClassLoader get (Class type) { ClassLoader parent = getParentClassLoader(type); // 1. fast-path: if (selfContextParentClassLoader.equals(parent)) { if (selfContextAccessClassLoader == null) { synchronized (accessClassLoaders) { // DCL with volatile semantics if (selfContextAccessClassLoader == null) selfContextAccessClassLoader = new AccessClassLoader(selfContextParentClassLoader); } } return selfContextAccessClassLoader; } // 2. normal search: synchronized (accessClassLoaders) { WeakReference<AccessClassLoader> ref = accessClassLoaders.get(parent); if (ref != null) { AccessClassLoader accessClassLoader = ref.get(); if (accessClassLoader != null) return accessClassLoader; else accessClassLoaders.remove(parent); // the value has been GC-reclaimed, but still not the key (defensive sanity) } AccessClassLoader accessClassLoader = new AccessClassLoader(parent); accessClassLoaders.put(parent, new WeakReference<AccessClassLoader>(accessClassLoader)); return accessClassLoader; } }
static AccessClassLoader get (Class type) { ClassLoader parent = getParentClassLoader(type); // 1. fast-path: if (selfContextParentClassLoader.equals(parent)) { if (selfContextAccessClassLoader == null) { synchronized (accessClassLoaders) { // DCL with volatile semantics if (selfContextAccessClassLoader == null) selfContextAccessClassLoader = new AccessClassLoader(selfContextParentClassLoader); } } return selfContextAccessClassLoader; } // 2. normal search: synchronized (accessClassLoaders) { WeakReference<AccessClassLoader> ref = accessClassLoaders.get(parent); if (ref != null) { AccessClassLoader accessClassLoader = ref.get(); if (accessClassLoader != null) return accessClassLoader; else accessClassLoaders.remove(parent); // the value has been GC-reclaimed, but still not the key (defensive sanity) } AccessClassLoader accessClassLoader = new AccessClassLoader(parent); accessClassLoaders.put(parent, new WeakReference<AccessClassLoader>(accessClassLoader)); return accessClassLoader; } }
static AccessClassLoader get (Class type) { ClassLoader parent = getParentClassLoader(type); // 1. fast-path: if (selfContextParentClassLoader.equals(parent)) { if (selfContextAccessClassLoader == null) { synchronized (accessClassLoaders) { // DCL with volatile semantics if (selfContextAccessClassLoader == null) selfContextAccessClassLoader = new AccessClassLoader(selfContextParentClassLoader); } } return selfContextAccessClassLoader; } // 2. normal search: synchronized (accessClassLoaders) { WeakReference<AccessClassLoader> ref = accessClassLoaders.get(parent); if (ref != null) { AccessClassLoader accessClassLoader = ref.get(); if (accessClassLoader != null) return accessClassLoader; else accessClassLoaders.remove(parent); // the value has been GC-reclaimed, but still not the key (defensive sanity) } AccessClassLoader accessClassLoader = new AccessClassLoader(parent); accessClassLoaders.put(parent, new WeakReference<AccessClassLoader>(accessClassLoader)); return accessClassLoader; } }
static AccessClassLoader get (Class type) { ClassLoader parent = getParentClassLoader(type); // 1. fast-path: if (selfContextParentClassLoader.equals(parent)) { if (selfContextAccessClassLoader == null) { synchronized (accessClassLoaders) { // DCL with volatile semantics if (selfContextAccessClassLoader == null) selfContextAccessClassLoader = new AccessClassLoader(selfContextParentClassLoader); } } return selfContextAccessClassLoader; } // 2. normal search: synchronized (accessClassLoaders) { WeakReference<AccessClassLoader> ref = accessClassLoaders.get(parent); if (ref != null) { AccessClassLoader accessClassLoader = ref.get(); if (accessClassLoader != null) return accessClassLoader; else accessClassLoaders.remove(parent); // the value has been GC-reclaimed, but still not the key (defensive sanity) } AccessClassLoader accessClassLoader = new AccessClassLoader(parent); accessClassLoaders.put(parent, new WeakReference<AccessClassLoader>(accessClassLoader)); return accessClassLoader; } }