From e061b189402d96fbcaeb792c714461be21cd057f Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 17 Jul 2007 12:00:57 +0000 Subject: QPID-541 : Change to use threadlocal maps for intern for the common case to avoid excessive synchronization. In the uncommon case will require more lookup. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/M2@556898 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/framing/AMQShortString.java | 50 ++++++++++++++++------ 1 file changed, 38 insertions(+), 12 deletions(-) (limited to 'java/common') diff --git a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java index ec29d62847..df99f6589d 100644 --- a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java +++ b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java @@ -39,7 +39,16 @@ import java.lang.ref.WeakReference; public final class AMQShortString implements CharSequence, Comparable { - private static final Map> internMap = + private static final ThreadLocal>> _localInternMap = + new ThreadLocal>>() + { + protected Map> initialValue() + { + return new WeakHashMap>(); + }; + }; + + private static final Map> _globalInternMap = new WeakHashMap>(); private static final Logger _logger = LoggerFactory.getLogger(AMQShortString.class); @@ -51,6 +60,7 @@ public final class AMQShortString implements CharSequence, Comparable> localMap = + _localInternMap.get(); + + WeakReference ref = localMap.get(this); + AMQShortString internString; + + if(ref != null) + { + internString = ref.get(); + if(internString != null) + { + return internString; + } + } + + + synchronized(_globalInternMap) { - WeakReference ref = internMap.get(this); - if(ref != null) + ref = _globalInternMap.get(this); + if((ref == null) || ((internString = ref.get()) == null)) { - AMQShortString internString = ref.get(); - if(internString != null) - { - return internString; - } + internString = new AMQShortString(getBytes()); + ref = new WeakReference(internString); + _globalInternMap.put(internString, ref); } - AMQShortString internString = new AMQShortString(getBytes()); - internMap.put(internString, new WeakReference(internString)); - return internString; } + localMap.put(internString, ref); + return internString; + } } -- cgit v1.2.1