8166507: ConcurrentSkipListSet.clear() can leave the Set in an invalid state

Reviewed-by: martin, smarks, psandoz
This commit is contained in:
Doug Lea 2016-11-28 23:39:54 -08:00
parent 3d0d86185e
commit 58623faf53

View File

@ -1650,7 +1650,24 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
* Removes all of the mappings from this map.
*/
public void clear() {
initialize();
for (;;) {
Node<K,V> b, n;
HeadIndex<K,V> h = head, d = (HeadIndex<K,V>)h.down;
if (d != null)
casHead(h, d); // remove levels
else if ((b = h.node) != null && (n = b.next) != null) {
Node<K,V> 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;
}
}
/**