# HG changeset patch # User dl # Date 1480405194 28800 # Node ID bfc781c5078f9f0c79e57d793399a3fe3411134c # Parent 0193886267c39fabc1f8d63ef507e86231bf5c7d 8166507: ConcurrentSkipListSet.clear() can leave the Set in an invalid state Reviewed-by: martin, smarks, psandoz diff -r 0193886267c3 -r bfc781c5078f jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java --- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Mon Nov 28 23:36:11 2016 -0800 +++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Mon Nov 28 23:39:54 2016 -0800 @@ -1650,7 +1650,24 @@ * 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; + } } /**