diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 7734a265bed..2ae29aa42f3 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -1650,7 +1650,24 @@ public class ConcurrentSkipListMap extends AbstractMap * Removes all of the mappings from this map. */ public void clear() { - initialize(); + for (;;) { + Node b, n; + HeadIndex h = head, d = (HeadIndex)h.down; + if (d != null) + casHead(h, d); // remove levels + else if ((b = h.node) != null && (n = b.next) != null) { + Node f = n.next; // remove values + if (n == b.next) { + Object v = n.value; + if (v == null) + n.helpDelete(b, f); + else if (n.casValue(v, null) && n.appendMarker(f)) + b.casNext(n, f); + } + } + else + break; + } } /**