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