[exo-jcr-commits] exo-jcr SVN: r3511 - jcr/trunk/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:50:15 EST 2010
Author: tolusha
Date: 2010-11-22 07:50:14 -0500 (Mon, 22 Nov 2010)
New Revision: 3511
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
Log:
JCR-1067: Reduce contention on read in NodeTypeDataHierarchyHolder
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
===================================================================
--- jcr/trunk/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)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java 2010-11-22 12:50:14 UTC (rev 3511)
@@ -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