[exo-jcr-commits] exo-jcr SVN: r3510 - jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Nov 22 07:47:59 EST 2010


Author: tolusha
Date: 2010-11-22 07:47:58 -0500 (Mon, 22 Nov 2010)
New Revision: 3510

Modified:
   jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
Log:
JCR-1506: Reduce contention on read in NodeTypeDataHierarchyHolder

Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java	2010-11-22 10:50:10 UTC (rev 3509)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java	2010-11-22 12:47:58 UTC (rev 3510)
@@ -25,11 +25,12 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 
 import javax.jcr.RepositoryException;
 
@@ -46,11 +47,11 @@
     */
    private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.NodeTypeDataHierarchyHolder");
 
-   private final Map<InternalQName, NodeTypeHolder> nodeTypes;
+   private volatile Map<InternalQName, NodeTypeHolder> nodeTypes;
 
    public NodeTypeDataHierarchyHolder()
    {
-      nodeTypes = new ConcurrentHashMap<InternalQName, NodeTypeHolder>();
+      this(new HashMap<InternalQName, NodeTypeHolder>());
    }
 
    /**
@@ -60,7 +61,7 @@
     */
    public NodeTypeDataHierarchyHolder(Map<InternalQName, NodeTypeHolder> nodeTypes)
    {
-      this.nodeTypes = nodeTypes;
+      this.nodeTypes = Collections.unmodifiableMap(nodeTypes);
    }
 
    /**
@@ -209,12 +210,19 @@
    {
       final Set<InternalQName> supers = new HashSet<InternalQName>();
       mergeAllSupertypes(supers, nodeType.getDeclaredSupertypeNames(), volatileNodeTypes);
-      nodeTypes.put(nodeType.getName(), new NodeTypeHolder(nodeType, supers));
+      synchronized (this)
+      {
+         Map<InternalQName, NodeTypeHolder> nodeTypesTmp = new HashMap<InternalQName, NodeTypeHolder>(nodeTypes);
+         nodeTypesTmp.put(nodeType.getName(), new NodeTypeHolder(nodeType, supers));
+         this.nodeTypes = Collections.unmodifiableMap(nodeTypesTmp);         
+      }
    }
 
-   void removeNodeType(final InternalQName nodeTypeName)
+   synchronized void removeNodeType(final InternalQName nodeTypeName)
    {
-      nodeTypes.remove(nodeTypeName);
+      Map<InternalQName, NodeTypeHolder> nodeTypesTmp = new HashMap<InternalQName, NodeTypeHolder>(nodeTypes);
+      nodeTypesTmp.remove(nodeTypeName);
+      this.nodeTypes = Collections.unmodifiableMap(nodeTypesTmp);         
    }
 
    protected synchronized void mergeAllSupertypes(Set<InternalQName> list, final InternalQName[] supers,
@@ -256,7 +264,7 @@
     */
    protected NodeTypeDataHierarchyHolder createCopy()
    {
-      return new NodeTypeDataHierarchyHolder(new ConcurrentHashMap<InternalQName, NodeTypeHolder>(nodeTypes));
+      return new NodeTypeDataHierarchyHolder(new HashMap<InternalQName, NodeTypeHolder>(nodeTypes));
    }
 
    class NodeTypeHolder



More information about the exo-jcr-commits mailing list