Repository: tapestry-5 Updated Branches: refs/heads/master 1c42cceef -> b58621fbf
reduce lock-contention during page loading #2 Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/b58621fb Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/b58621fb Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/b58621fb Branch: refs/heads/master Commit: b58621fbf8a01e9f7fea2c19881b83f5d6de651f Parents: 1c42cce Author: Michael Mikhulya <[email protected]> Authored: Tue Jul 19 11:55:30 2016 +0300 Committer: Jochen Kemnade <[email protected]> Committed: Wed Oct 18 08:11:34 2017 +0200 ---------------------------------------------------------------------- .../internal/plastic/PlasticClassPool.java | 63 ++++++++++---------- .../internal/plastic/PlasticInternalUtils.java | 7 +++ 2 files changed, 38 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b58621fb/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java ---------------------------------------------------------------------- diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java index 3cf1700..dfbb8cf 100644 --- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java +++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassPool.java @@ -56,7 +56,7 @@ public class PlasticClassPool implements ClassLoaderDelegate, Opcodes, PlasticCl * Maps class names to instantiators for that class name. * Synchronized on the loader. */ - private final Map<String, ClassInstantiator> instantiators = PlasticInternalUtils.newMap(); + private final Map<String, ClassInstantiator> instantiators = PlasticInternalUtils.newConcurrentMap(); private final InheritanceData emptyInheritanceData = new InheritanceData(null); @@ -599,50 +599,49 @@ public class PlasticClassPool implements ClassLoaderDelegate, Opcodes, PlasticCl public ClassInstantiator getClassInstantiator(String className) { - synchronized (loader) + ClassInstantiator result = instantiators.get(className); + + if (result == null) { - if (!instantiators.containsKey(className)) + try { - try - { - loader.loadClass(className); - } catch (ClassNotFoundException ex) - { - throw new RuntimeException(ex); - } + loader.loadClass(className); + result = instantiators.get(className); + } catch (ClassNotFoundException ex) + { + throw new RuntimeException(ex); } + } - ClassInstantiator result = instantiators.get(className); - if (result == null) - { - // TODO: Verify that the problem is incorrect package, and not any other failure. + if (result != null) + { + return result; + } - StringBuilder b = new StringBuilder(); - b.append("Class '") - .append(className) - .append("' is not a transformed class. Transformed classes should be in one of the following packages: "); + // TODO: Verify that the problem is incorrect package, and not any other failure. - String sep = ""; + StringBuilder b = new StringBuilder(); + b.append("Class '") + .append(className) + .append("' is not a transformed class. Transformed classes should be in one of the following packages: "); - List<String> names = new ArrayList<String>(controlledPackages); - Collections.sort(names); + String sep = ""; - for (String name : names) - { - b.append(sep); - b.append(name); + List<String> names = new ArrayList<String>(controlledPackages); + Collections.sort(names); - sep = ", "; - } + for (String name : names) + { + b.append(sep); + b.append(name); - String message = b.append('.').toString(); + sep = ", "; + } - throw new IllegalArgumentException(message); - } + String message = b.append('.').toString(); - return result; - } + throw new IllegalArgumentException(message); } TypeCategory getTypeCategory(String typeName) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b58621fb/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java ---------------------------------------------------------------------- diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java index 8dc86a3..f0ea0fb 100644 --- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java +++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java @@ -25,6 +25,8 @@ import java.lang.reflect.Array; import java.net.URISyntaxException; import java.net.URL; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -196,6 +198,11 @@ public class PlasticInternalUtils return new HashMap<K, V>(); } + public static <K, V> ConcurrentMap<K, V> newConcurrentMap() + { + return new ConcurrentHashMap<K, V>(); + } + public static <T> Set<T> newSet() { return new HashSet<T>();
