Repository: tapestry-5 Updated Branches: refs/heads/master 9a5c183af -> f2a97f3cd
TAP5-2477: improve performance of org.apache.tapestry5.ioc.internal.services.PerthreadManagerImpl.getPerthreadMap(), extract classes Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/f2a97f3c Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/f2a97f3c Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/f2a97f3c Branch: refs/heads/master Commit: f2a97f3cd51362ad94596b01f672d35cedd86438 Parents: 9a5c183 Author: Jochen Kemnade <jochen.kemn...@eddyson.de> Authored: Wed Jul 29 14:53:49 2015 +0200 Committer: Jochen Kemnade <jochen.kemn...@eddyson.de> Committed: Wed Jul 29 14:53:49 2015 +0200 ---------------------------------------------------------------------- .../internal/services/PerthreadManagerImpl.java | 149 +++++++++++-------- 1 file changed, 85 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/f2a97f3c/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java index 00be7a4..83b08f7 100644 --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java +++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java @@ -46,7 +46,7 @@ public class PerthreadManagerImpl implements PerthreadManager private final AtomicInteger uuidGenerator = new AtomicInteger(); - private final AtomicBoolean shutdown = new AtomicBoolean(); + private volatile boolean shutdown = false; public PerthreadManagerImpl(Logger logger) { @@ -63,7 +63,7 @@ public class PerthreadManagerImpl implements PerthreadManager public void run() { cleanup(); - shutdown.set(true); + shutdown = true; } }); } @@ -73,7 +73,7 @@ public class PerthreadManagerImpl implements PerthreadManager // This is a degenerate case; it may not even exist; but if during registry shutdown somehow code executes // that attempts to create new values or add new listeners, those go into a new map instance that is // not referenced (and so immediately GCed). - if (shutdown.get()) + if (shutdown) { return CollectionFactory.newMap(); } @@ -155,25 +155,7 @@ public class PerthreadManagerImpl implements PerthreadManager <T> ObjectCreator<T> createValue(final Object key, final ObjectCreator<T> delegate) { - return new ObjectCreator<T>() - { - public T createObject() - { - Map map = getPerthreadMap(); - T storedValue = (T) map.get(key); - - if (storedValue != null) - { - return (storedValue == NULL_VALUE) ? null : storedValue; - } - - T newValue = delegate.createObject(); - - map.put(key, newValue == null ? NULL_VALUE : newValue); - - return newValue; - } - }; + return new DefaultObjectCreator<T>(key, delegate); } public <T> ObjectCreator<T> createValue(ObjectCreator<T> delegate) @@ -183,48 +165,7 @@ public class PerthreadManagerImpl implements PerthreadManager <T> PerThreadValue<T> createValue(final Object key) { - return new PerThreadValue<T>() - { - @Override - public T get() - { - return get(null); - } - - @Override - public T get(T defaultValue) - { - Map map = getPerthreadMap(); - - Object storedValue = map.get(key); - - if (storedValue == null) - { - return defaultValue; - } - - if (storedValue == NULL_VALUE) - { - return null; - } - - return (T) storedValue; - } - - @Override - public T set(T newValue) - { - getPerthreadMap().put(key, newValue == null ? NULL_VALUE : newValue); - - return newValue; - } - - @Override - public boolean exists() - { - return getPerthreadMap().containsKey(key); - } - }; + return new DefaultPerThreadValue(key); } @Override @@ -258,4 +199,84 @@ public class PerthreadManagerImpl implements PerthreadManager cleanup(); } } + + private final class DefaultPerThreadValue<T> implements PerThreadValue<T> + { + private final Object key; + + DefaultPerThreadValue(final Object key) + { + this.key = key; + + } + @Override + public T get() + { + return get(null); + } + + @Override + public T get(T defaultValue) + { + Map map = getPerthreadMap(); + + Object storedValue = map.get(key); + + if (storedValue == null) + { + return defaultValue; + } + + if (storedValue == NULL_VALUE) + { + return null; + } + + return (T) storedValue; + } + + @Override + public T set(T newValue) + { + getPerthreadMap().put(key, newValue == null ? NULL_VALUE : newValue); + + return newValue; + } + + @Override + public boolean exists() + { + return getPerthreadMap().containsKey(key); + } + } + + private final class DefaultObjectCreator<T> implements ObjectCreator<T> + { + + private final Object key; + private final ObjectCreator<T> delegate; + + DefaultObjectCreator(final Object key, final ObjectCreator<T> delegate) + { + this.key = key; + this.delegate = delegate; + } + + public T createObject() + { + Map map = getPerthreadMap(); + T storedValue = (T) map.get(key); + + if (storedValue != null) + { + return (storedValue == NULL_VALUE) ? null : storedValue; + } + + T newValue = delegate.createObject(); + + map.put(key, newValue == null ? NULL_VALUE : newValue); + + return newValue; + } + } }