diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/BasicProjectMemoizer.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/BasicProjectMemoizer.java index efc8e06c74..e5b6a7463d 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/BasicProjectMemoizer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/BasicProjectMemoizer.java @@ -28,6 +28,8 @@ public abstract class BasicProjectMemoizer> classes = new WeakHashMap<>(); private Map> operations = new WeakHashMap<>(); + private final Object classesSynchronizer = new Object(); + private final Object operationsSynchronizer = new Object(); /** Clears all memoizers. Used for tests. */ public void reset() { @@ -38,8 +40,10 @@ public abstract class BasicProjectMemoizer getOperationMemoizer(QualifiedName qname) { - if (!operations.containsKey(qname)) { - operations.put(qname, new BasicMetricMemoizer()); + synchronized (operationsSynchronizer) { + if (!operations.containsKey(qname)) { + operations.put(qname, new BasicMetricMemoizer()); + } } return operations.get(qname); @@ -48,8 +52,10 @@ public abstract class BasicProjectMemoizer getClassMemoizer(QualifiedName qname) { - if (!classes.containsKey(qname)) { - classes.put(qname, new BasicMetricMemoizer()); + synchronized (classesSynchronizer) { + if (!classes.containsKey(qname)) { + classes.put(qname, new BasicMetricMemoizer()); + } } return classes.get(qname);