diff --git a/platform/platform-tests/testSrc/com/intellij/util/containers/ConcurrentMapsTest.java b/platform/platform-tests/testSrc/com/intellij/util/containers/ConcurrentMapsTest.java index 8ebcacccf672..35e8add8a275 100644 --- a/platform/platform-tests/testSrc/com/intellij/util/containers/ConcurrentMapsTest.java +++ b/platform/platform-tests/testSrc/com/intellij/util/containers/ConcurrentMapsTest.java @@ -97,17 +97,20 @@ public class ConcurrentMapsTest { } private void checkKeyIsTossedAfterGCPressure(Map map) { + assertTrue(map.isEmpty()); map.put(new Object(), new Object()); //noinspection SizeReplaceableByIsEmpty do { map.put(this, this); // to run processQueues(); + assertFalse(map.isEmpty()); map.remove(this); GCUtil.tryGcSoftlyReachableObjects(); System.gc(); } while (map.size() != 0); + assertTrue(map.isEmpty()); assertEquals(0, map.size()); map.put(this, this); assertEquals(1, map.size()); @@ -255,6 +258,7 @@ public class ConcurrentMapsTest { } private static void checkTossedKeyAndValue(@NotNull RefKeyRefValueHashMap map) { + assertTrue(map.isEmpty()); map.put(new Object(), new Object()); do { diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java index 33690d579ece..0741ab480887 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java @@ -126,7 +126,8 @@ abstract class ConcurrentRefHashMap extends AbstractMap implements C @Override public boolean isEmpty() { - return myMap.isEmpty(); + // make easier and alloc-free call to myMap first + return myMap.isEmpty() || entrySet().isEmpty(); } @Override diff --git a/platform/util/src/com/intellij/util/containers/RefHashMap.java b/platform/util/src/com/intellij/util/containers/RefHashMap.java index 5d43b267e9a0..43fee25e46c8 100644 --- a/platform/util/src/com/intellij/util/containers/RefHashMap.java +++ b/platform/util/src/com/intellij/util/containers/RefHashMap.java @@ -202,7 +202,8 @@ abstract class RefHashMap extends AbstractMap implements Map { @Override public boolean isEmpty() { - return myMap.isEmpty(); + // make easier and alloc-free call to myMap first + return myMap.isEmpty() || entrySet().isEmpty(); } @Override @@ -383,7 +384,8 @@ abstract class RefHashMap extends AbstractMap implements Map { @NotNull @Override public Set> entrySet() { - if (entrySet == null) entrySet = new EntrySet(); - return entrySet; + Set> es = entrySet; + if (es == null) entrySet = es = new EntrySet(); + return es; } }