From 8762fb8a4d75fa9ab4881649cddc7ab22685263c Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 27 Apr 2017 17:41:18 +0200 Subject: [PATCH] sync instead of concurrent set --- .../reference/RefClassImpl.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java index d8b9b676201d..1b133b4f1c9c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefClassImpl.java @@ -58,7 +58,7 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { private static final int IS_LOCAL_MASK = 0x1000000; private Set myBases; // singleton (to conserve the memory) or THashSet - private volatile Set mySubClasses; + private Set mySubClasses; // singleton (to conserve the memory) or THashSet private List myConstructors; private RefMethodImpl myDefaultConstructor; private List myOverridingMethods; @@ -334,21 +334,30 @@ public class RefClassImpl extends RefJavaElementImpl implements RefClass { @Override @NotNull - public Set getSubClasses() { + public synchronized Set getSubClasses() { if (mySubClasses == null) return EMPTY_CLASS_SET; return mySubClasses; } - private void addSubClass(@NotNull RefClass refClass){ + private synchronized void addSubClass(@NotNull RefClass refClass){ if (mySubClasses == null) { - mySubClasses = ContainerUtil.newConcurrentSet(); + mySubClasses = Collections.singleton(refClass); + return; + } + if (mySubClasses.size() == 1) { + // convert from singleton + mySubClasses = new THashSet<>(mySubClasses); } mySubClasses.add(refClass); } - - private void removeSubClass(RefClass refClass){ + private synchronized void removeSubClass(RefClass refClass){ if (mySubClasses == null) return; - mySubClasses.remove(refClass); + if (mySubClasses.size() == 1) { + mySubClasses = null; + } + else { + mySubClasses.remove(refClass); + } } @Override