Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 08DA511A04 for ; Tue, 12 Aug 2014 17:01:32 +0000 (UTC) Received: (qmail 70460 invoked by uid 500); 12 Aug 2014 17:01:31 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 70216 invoked by uid 500); 12 Aug 2014 17:01:31 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 70148 invoked by uid 99); 12 Aug 2014 17:01:31 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 12 Aug 2014 17:01:31 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 7F1E9921471; Tue, 12 Aug 2014 17:01:31 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dkulp@apache.org To: commits@cxf.apache.org Date: Tue, 12 Aug 2014 17:01:32 -0000 Message-Id: In-Reply-To: <90f299a799874aa58787680d287cfb57@git.apache.org> References: <90f299a799874aa58787680d287cfb57@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/4] git commit: No need to lock for the getClassObject call once the class is loaded. Removes most locking in most cases within ExtensionManagerImpl. No need to lock for the getClassObject call once the class is loaded. Removes most locking in most cases within ExtensionManagerImpl. Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/8fda71d3 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/8fda71d3 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/8fda71d3 Branch: refs/heads/2.7.x-fixes Commit: 8fda71d3950af1fef06d3e1f7ee12359416f6710 Parents: 4414719 Author: Daniel Kulp Authored: Tue Aug 12 11:54:47 2014 -0400 Committer: Daniel Kulp Committed: Tue Aug 12 12:44:56 2014 -0400 ---------------------------------------------------------------------- .../org/apache/cxf/bus/extension/Extension.java | 19 ++++-- .../cxf/bus/extension/ExtensionManagerImpl.java | 71 ++++++++++---------- 2 files changed, 49 insertions(+), 41 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/8fda71d3/rt/core/src/main/java/org/apache/cxf/bus/extension/Extension.java ---------------------------------------------------------------------- diff --git a/rt/core/src/main/java/org/apache/cxf/bus/extension/Extension.java b/rt/core/src/main/java/org/apache/cxf/bus/extension/Extension.java index 85e0860..81cd8aa 100644 --- a/rt/core/src/main/java/org/apache/cxf/bus/extension/Extension.java +++ b/rt/core/src/main/java/org/apache/cxf/bus/extension/Extension.java @@ -37,8 +37,8 @@ public class Extension { protected String className; protected ClassLoader classloader; - protected Class clazz; - protected Class intf; + protected volatile Class clazz; + protected volatile Class intf; protected String interfaceName; protected boolean deferred; protected Collection namespaces = new ArrayList(); @@ -191,8 +191,13 @@ public class Extension { if (notFound) { return null; } - if (clazz == null) { - clazz = tryClass(className, cl); + if (clazz != null) { + return clazz; + } + synchronized (this) { + if (clazz == null) { + clazz = tryClass(className, cl); + } } return clazz; } @@ -287,7 +292,11 @@ public class Extension { if (intf != null || notFound) { return intf; } - intf = tryClass(interfaceName, cl); + synchronized (this) { + if (intf == null) { + intf = tryClass(interfaceName, cl); + } + } return intf; } http://git-wip-us.apache.org/repos/asf/cxf/blob/8fda71d3/rt/core/src/main/java/org/apache/cxf/bus/extension/ExtensionManagerImpl.java ---------------------------------------------------------------------- diff --git a/rt/core/src/main/java/org/apache/cxf/bus/extension/ExtensionManagerImpl.java b/rt/core/src/main/java/org/apache/cxf/bus/extension/ExtensionManagerImpl.java index c1ba715..a5dbc09 100644 --- a/rt/core/src/main/java/org/apache/cxf/bus/extension/ExtensionManagerImpl.java +++ b/rt/core/src/main/java/org/apache/cxf/bus/extension/ExtensionManagerImpl.java @@ -138,9 +138,9 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc public void activateAllByType(Class type) { for (Extension e : all.values()) { if (e.getLoadedObject() == null) { - synchronized (e) { - Class cls = e.getClassObject(loader); - if (cls != null && type.isAssignableFrom(cls)) { + Class cls = e.getClassObject(loader); + if (cls != null && type.isAssignableFrom(cls)) { + synchronized (e) { loadAndRegister(e); } } @@ -203,18 +203,17 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc } final void loadAndRegister(Extension e) { + Class cls = null; + if (null != e.getInterfaceName() && !"".equals(e.getInterfaceName())) { + cls = e.loadInterface(loader); + } else { + cls = e.getClassObject(loader); + } + if (null != activated && null != cls && null != activated.get(cls)) { + return; + } + synchronized (e) { - Class cls = null; - if (null != e.getInterfaceName() && !"".equals(e.getInterfaceName())) { - cls = e.loadInterface(loader); - } else { - cls = e.getClassObject(loader); - } - - if (null != activated && null != cls && null != activated.get(cls)) { - return; - } - Object obj = e.load(loader, bus); if (obj == null) { return; @@ -267,10 +266,9 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc } Extension e = all.get(name); if (e != null) { - synchronized (e) { - Class cls = e.getClassObject(loader); - - if (cls != null && type.isAssignableFrom(e.getClassObject(loader))) { + Class cls = e.getClassObject(loader); + if (cls != null && type.isAssignableFrom(cls)) { + synchronized (e) { if (e.getLoadedObject() == null) { loadAndRegister(e); } @@ -307,9 +305,9 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc public List getBeanNamesOfType(Class type) { List ret = new LinkedList(); for (Extension ex : all.values()) { - synchronized (ex) { - Class cls = ex.getClassObject(loader); - if (cls != null && type.isAssignableFrom(cls)) { + Class cls = ex.getClassObject(loader); + if (cls != null && type.isAssignableFrom(cls)) { + synchronized (ex) { ret.add(ex.getName()); } } @@ -333,9 +331,9 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc List ret = new LinkedList(); Extension ext = all.get(type.getName()); if (ext != null) { - synchronized (ext) { - Class cls = ext.getClassObject(loader); - if (cls != null && type.isAssignableFrom(cls)) { + Class cls = ext.getClassObject(loader); + if (cls != null && type.isAssignableFrom(cls)) { + synchronized (ext) { if (ext.getLoadedObject() == null) { loadAndRegister(ext); } @@ -345,9 +343,9 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc } for (Extension ex : all.values()) { if (ex != ext) { - synchronized (ex) { - Class cls = ex.getClassObject(loader); - if (cls != null && type.isAssignableFrom(cls)) { + Class cls = ex.getClassObject(loader); + if (cls != null && type.isAssignableFrom(cls)) { + synchronized (ex) { if (ex.getLoadedObject() == null) { loadAndRegister(ex); } @@ -361,15 +359,16 @@ public class ExtensionManagerImpl implements ExtensionManager, ConfiguredBeanLoc public boolean loadBeansOfType(Class type, BeanLoaderListener listener) { boolean loaded = false; for (Extension ex : all.values()) { - synchronized (ex) { - Class cls = ex.getClassObject(loader); - if (cls != null - && ex.getLoadedObject() == null - && type.isAssignableFrom(cls) - && listener.loadBean(ex.getName(), cls.asSubclass(type))) { - loadAndRegister(ex); - if (listener.beanLoaded(ex.getName(), type.cast(ex.getLoadedObject()))) { - return true; + Class cls = ex.getClassObject(loader); + if (cls != null + && ex.getLoadedObject() == null + && type.isAssignableFrom(cls)) { + synchronized (ex) { + if (listener.loadBean(ex.getName(), cls.asSubclass(type))) { + loadAndRegister(ex); + if (listener.beanLoaded(ex.getName(), type.cast(ex.getLoadedObject()))) { + return true; + } } } }