rt/emul/compact/src/main/java/java/util/concurrent/ConcurrentSkipListMap.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 19 Mar 2016 10:46:31 +0100
branchjdk7-b147
changeset 1890 212417b74b72
child 1895 bfaf3300b7ba
permissions -rw-r--r--
Bringing in all concurrent package from JDK7-b147
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  *
     4  * This code is free software; you can redistribute it and/or modify it
     5  * under the terms of the GNU General Public License version 2 only, as
     6  * published by the Free Software Foundation.  Oracle designates this
     7  * particular file as subject to the "Classpath" exception as provided
     8  * by Oracle in the LICENSE file that accompanied this code.
     9  *
    10  * This code is distributed in the hope that it will be useful, but WITHOUT
    11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    13  * version 2 for more details (a copy is included in the LICENSE file that
    14  * accompanied this code).
    15  *
    16  * You should have received a copy of the GNU General Public License version
    17  * 2 along with this work; if not, write to the Free Software Foundation,
    18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    19  *
    20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    21  * or visit www.oracle.com if you need additional information or have any
    22  * questions.
    23  */
    24 
    25 /*
    26  * This file is available under and governed by the GNU General Public
    27  * License version 2 only, as published by the Free Software Foundation.
    28  * However, the following notice accompanied the original version of this
    29  * file:
    30  *
    31  * Written by Doug Lea with assistance from members of JCP JSR-166
    32  * Expert Group and released to the public domain, as explained at
    33  * http://creativecommons.org/publicdomain/zero/1.0/
    34  */
    35 
    36 package java.util.concurrent;
    37 import java.util.*;
    38 import java.util.concurrent.atomic.*;
    39 
    40 /**
    41  * A scalable concurrent {@link ConcurrentNavigableMap} implementation.
    42  * The map is sorted according to the {@linkplain Comparable natural
    43  * ordering} of its keys, or by a {@link Comparator} provided at map
    44  * creation time, depending on which constructor is used.
    45  *
    46  * <p>This class implements a concurrent variant of <a
    47  * href="http://en.wikipedia.org/wiki/Skip_list" target="_top">SkipLists</a>
    48  * providing expected average <i>log(n)</i> time cost for the
    49  * <tt>containsKey</tt>, <tt>get</tt>, <tt>put</tt> and
    50  * <tt>remove</tt> operations and their variants.  Insertion, removal,
    51  * update, and access operations safely execute concurrently by
    52  * multiple threads.  Iterators are <i>weakly consistent</i>, returning
    53  * elements reflecting the state of the map at some point at or since
    54  * the creation of the iterator.  They do <em>not</em> throw {@link
    55  * ConcurrentModificationException}, and may proceed concurrently with
    56  * other operations. Ascending key ordered views and their iterators
    57  * are faster than descending ones.
    58  *
    59  * <p>All <tt>Map.Entry</tt> pairs returned by methods in this class
    60  * and its views represent snapshots of mappings at the time they were
    61  * produced. They do <em>not</em> support the <tt>Entry.setValue</tt>
    62  * method. (Note however that it is possible to change mappings in the
    63  * associated map using <tt>put</tt>, <tt>putIfAbsent</tt>, or
    64  * <tt>replace</tt>, depending on exactly which effect you need.)
    65  *
    66  * <p>Beware that, unlike in most collections, the <tt>size</tt>
    67  * method is <em>not</em> a constant-time operation. Because of the
    68  * asynchronous nature of these maps, determining the current number
    69  * of elements requires a traversal of the elements, and so may report
    70  * inaccurate results if this collection is modified during traversal.
    71  * Additionally, the bulk operations <tt>putAll</tt>, <tt>equals</tt>,
    72  * <tt>toArray</tt>, <tt>containsValue</tt>, and <tt>clear</tt> are
    73  * <em>not</em> guaranteed to be performed atomically. For example, an
    74  * iterator operating concurrently with a <tt>putAll</tt> operation
    75  * might view only some of the added elements.
    76  *
    77  * <p>This class and its views and iterators implement all of the
    78  * <em>optional</em> methods of the {@link Map} and {@link Iterator}
    79  * interfaces. Like most other concurrent collections, this class does
    80  * <em>not</em> permit the use of <tt>null</tt> keys or values because some
    81  * null return values cannot be reliably distinguished from the absence of
    82  * elements.
    83  *
    84  * <p>This class is a member of the
    85  * <a href="{@docRoot}/../technotes/guides/collections/index.html">
    86  * Java Collections Framework</a>.
    87  *
    88  * @author Doug Lea
    89  * @param <K> the type of keys maintained by this map
    90  * @param <V> the type of mapped values
    91  * @since 1.6
    92  */
    93 public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
    94     implements ConcurrentNavigableMap<K,V>,
    95                Cloneable,
    96                java.io.Serializable {
    97     /*
    98      * This class implements a tree-like two-dimensionally linked skip
    99      * list in which the index levels are represented in separate
   100      * nodes from the base nodes holding data.  There are two reasons
   101      * for taking this approach instead of the usual array-based
   102      * structure: 1) Array based implementations seem to encounter
   103      * more complexity and overhead 2) We can use cheaper algorithms
   104      * for the heavily-traversed index lists than can be used for the
   105      * base lists.  Here's a picture of some of the basics for a
   106      * possible list with 2 levels of index:
   107      *
   108      * Head nodes          Index nodes
   109      * +-+    right        +-+                      +-+
   110      * |2|---------------->| |--------------------->| |->null
   111      * +-+                 +-+                      +-+
   112      *  | down              |                        |
   113      *  v                   v                        v
   114      * +-+            +-+  +-+       +-+            +-+       +-+
   115      * |1|----------->| |->| |------>| |----------->| |------>| |->null
   116      * +-+            +-+  +-+       +-+            +-+       +-+
   117      *  v              |    |         |              |         |
   118      * Nodes  next     v    v         v              v         v
   119      * +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+
   120      * | |->|A|->|B|->|C|->|D|->|E|->|F|->|G|->|H|->|I|->|J|->|K|->null
   121      * +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+
   122      *
   123      * The base lists use a variant of the HM linked ordered set
   124      * algorithm. See Tim Harris, "A pragmatic implementation of
   125      * non-blocking linked lists"
   126      * http://www.cl.cam.ac.uk/~tlh20/publications.html and Maged
   127      * Michael "High Performance Dynamic Lock-Free Hash Tables and
   128      * List-Based Sets"
   129      * http://www.research.ibm.com/people/m/michael/pubs.htm.  The
   130      * basic idea in these lists is to mark the "next" pointers of
   131      * deleted nodes when deleting to avoid conflicts with concurrent
   132      * insertions, and when traversing to keep track of triples
   133      * (predecessor, node, successor) in order to detect when and how
   134      * to unlink these deleted nodes.
   135      *
   136      * Rather than using mark-bits to mark list deletions (which can
   137      * be slow and space-intensive using AtomicMarkedReference), nodes
   138      * use direct CAS'able next pointers.  On deletion, instead of
   139      * marking a pointer, they splice in another node that can be
   140      * thought of as standing for a marked pointer (indicating this by
   141      * using otherwise impossible field values).  Using plain nodes
   142      * acts roughly like "boxed" implementations of marked pointers,
   143      * but uses new nodes only when nodes are deleted, not for every
   144      * link.  This requires less space and supports faster
   145      * traversal. Even if marked references were better supported by
   146      * JVMs, traversal using this technique might still be faster
   147      * because any search need only read ahead one more node than
   148      * otherwise required (to check for trailing marker) rather than
   149      * unmasking mark bits or whatever on each read.
   150      *
   151      * This approach maintains the essential property needed in the HM
   152      * algorithm of changing the next-pointer of a deleted node so
   153      * that any other CAS of it will fail, but implements the idea by
   154      * changing the pointer to point to a different node, not by
   155      * marking it.  While it would be possible to further squeeze
   156      * space by defining marker nodes not to have key/value fields, it
   157      * isn't worth the extra type-testing overhead.  The deletion
   158      * markers are rarely encountered during traversal and are
   159      * normally quickly garbage collected. (Note that this technique
   160      * would not work well in systems without garbage collection.)
   161      *
   162      * In addition to using deletion markers, the lists also use
   163      * nullness of value fields to indicate deletion, in a style
   164      * similar to typical lazy-deletion schemes.  If a node's value is
   165      * null, then it is considered logically deleted and ignored even
   166      * though it is still reachable. This maintains proper control of
   167      * concurrent replace vs delete operations -- an attempted replace
   168      * must fail if a delete beat it by nulling field, and a delete
   169      * must return the last non-null value held in the field. (Note:
   170      * Null, rather than some special marker, is used for value fields
   171      * here because it just so happens to mesh with the Map API
   172      * requirement that method get returns null if there is no
   173      * mapping, which allows nodes to remain concurrently readable
   174      * even when deleted. Using any other marker value here would be
   175      * messy at best.)
   176      *
   177      * Here's the sequence of events for a deletion of node n with
   178      * predecessor b and successor f, initially:
   179      *
   180      *        +------+       +------+      +------+
   181      *   ...  |   b  |------>|   n  |----->|   f  | ...
   182      *        +------+       +------+      +------+
   183      *
   184      * 1. CAS n's value field from non-null to null.
   185      *    From this point on, no public operations encountering
   186      *    the node consider this mapping to exist. However, other
   187      *    ongoing insertions and deletions might still modify
   188      *    n's next pointer.
   189      *
   190      * 2. CAS n's next pointer to point to a new marker node.
   191      *    From this point on, no other nodes can be appended to n.
   192      *    which avoids deletion errors in CAS-based linked lists.
   193      *
   194      *        +------+       +------+      +------+       +------+
   195      *   ...  |   b  |------>|   n  |----->|marker|------>|   f  | ...
   196      *        +------+       +------+      +------+       +------+
   197      *
   198      * 3. CAS b's next pointer over both n and its marker.
   199      *    From this point on, no new traversals will encounter n,
   200      *    and it can eventually be GCed.
   201      *        +------+                                    +------+
   202      *   ...  |   b  |----------------------------------->|   f  | ...
   203      *        +------+                                    +------+
   204      *
   205      * A failure at step 1 leads to simple retry due to a lost race
   206      * with another operation. Steps 2-3 can fail because some other
   207      * thread noticed during a traversal a node with null value and
   208      * helped out by marking and/or unlinking.  This helping-out
   209      * ensures that no thread can become stuck waiting for progress of
   210      * the deleting thread.  The use of marker nodes slightly
   211      * complicates helping-out code because traversals must track
   212      * consistent reads of up to four nodes (b, n, marker, f), not
   213      * just (b, n, f), although the next field of a marker is
   214      * immutable, and once a next field is CAS'ed to point to a
   215      * marker, it never again changes, so this requires less care.
   216      *
   217      * Skip lists add indexing to this scheme, so that the base-level
   218      * traversals start close to the locations being found, inserted
   219      * or deleted -- usually base level traversals only traverse a few
   220      * nodes. This doesn't change the basic algorithm except for the
   221      * need to make sure base traversals start at predecessors (here,
   222      * b) that are not (structurally) deleted, otherwise retrying
   223      * after processing the deletion.
   224      *
   225      * Index levels are maintained as lists with volatile next fields,
   226      * using CAS to link and unlink.  Races are allowed in index-list
   227      * operations that can (rarely) fail to link in a new index node
   228      * or delete one. (We can't do this of course for data nodes.)
   229      * However, even when this happens, the index lists remain sorted,
   230      * so correctly serve as indices.  This can impact performance,
   231      * but since skip lists are probabilistic anyway, the net result
   232      * is that under contention, the effective "p" value may be lower
   233      * than its nominal value. And race windows are kept small enough
   234      * that in practice these failures are rare, even under a lot of
   235      * contention.
   236      *
   237      * The fact that retries (for both base and index lists) are
   238      * relatively cheap due to indexing allows some minor
   239      * simplifications of retry logic. Traversal restarts are
   240      * performed after most "helping-out" CASes. This isn't always
   241      * strictly necessary, but the implicit backoffs tend to help
   242      * reduce other downstream failed CAS's enough to outweigh restart
   243      * cost.  This worsens the worst case, but seems to improve even
   244      * highly contended cases.
   245      *
   246      * Unlike most skip-list implementations, index insertion and
   247      * deletion here require a separate traversal pass occuring after
   248      * the base-level action, to add or remove index nodes.  This adds
   249      * to single-threaded overhead, but improves contended
   250      * multithreaded performance by narrowing interference windows,
   251      * and allows deletion to ensure that all index nodes will be made
   252      * unreachable upon return from a public remove operation, thus
   253      * avoiding unwanted garbage retention. This is more important
   254      * here than in some other data structures because we cannot null
   255      * out node fields referencing user keys since they might still be
   256      * read by other ongoing traversals.
   257      *
   258      * Indexing uses skip list parameters that maintain good search
   259      * performance while using sparser-than-usual indices: The
   260      * hardwired parameters k=1, p=0.5 (see method randomLevel) mean
   261      * that about one-quarter of the nodes have indices. Of those that
   262      * do, half have one level, a quarter have two, and so on (see
   263      * Pugh's Skip List Cookbook, sec 3.4).  The expected total space
   264      * requirement for a map is slightly less than for the current
   265      * implementation of java.util.TreeMap.
   266      *
   267      * Changing the level of the index (i.e, the height of the
   268      * tree-like structure) also uses CAS. The head index has initial
   269      * level/height of one. Creation of an index with height greater
   270      * than the current level adds a level to the head index by
   271      * CAS'ing on a new top-most head. To maintain good performance
   272      * after a lot of removals, deletion methods heuristically try to
   273      * reduce the height if the topmost levels appear to be empty.
   274      * This may encounter races in which it possible (but rare) to
   275      * reduce and "lose" a level just as it is about to contain an
   276      * index (that will then never be encountered). This does no
   277      * structural harm, and in practice appears to be a better option
   278      * than allowing unrestrained growth of levels.
   279      *
   280      * The code for all this is more verbose than you'd like. Most
   281      * operations entail locating an element (or position to insert an
   282      * element). The code to do this can't be nicely factored out
   283      * because subsequent uses require a snapshot of predecessor
   284      * and/or successor and/or value fields which can't be returned
   285      * all at once, at least not without creating yet another object
   286      * to hold them -- creating such little objects is an especially
   287      * bad idea for basic internal search operations because it adds
   288      * to GC overhead.  (This is one of the few times I've wished Java
   289      * had macros.) Instead, some traversal code is interleaved within
   290      * insertion and removal operations.  The control logic to handle
   291      * all the retry conditions is sometimes twisty. Most search is
   292      * broken into 2 parts. findPredecessor() searches index nodes
   293      * only, returning a base-level predecessor of the key. findNode()
   294      * finishes out the base-level search. Even with this factoring,
   295      * there is a fair amount of near-duplication of code to handle
   296      * variants.
   297      *
   298      * For explanation of algorithms sharing at least a couple of
   299      * features with this one, see Mikhail Fomitchev's thesis
   300      * (http://www.cs.yorku.ca/~mikhail/), Keir Fraser's thesis
   301      * (http://www.cl.cam.ac.uk/users/kaf24/), and Hakan Sundell's
   302      * thesis (http://www.cs.chalmers.se/~phs/).
   303      *
   304      * Given the use of tree-like index nodes, you might wonder why
   305      * this doesn't use some kind of search tree instead, which would
   306      * support somewhat faster search operations. The reason is that
   307      * there are no known efficient lock-free insertion and deletion
   308      * algorithms for search trees. The immutability of the "down"
   309      * links of index nodes (as opposed to mutable "left" fields in
   310      * true trees) makes this tractable using only CAS operations.
   311      *
   312      * Notation guide for local variables
   313      * Node:         b, n, f    for  predecessor, node, successor
   314      * Index:        q, r, d    for index node, right, down.
   315      *               t          for another index node
   316      * Head:         h
   317      * Levels:       j
   318      * Keys:         k, key
   319      * Values:       v, value
   320      * Comparisons:  c
   321      */
   322 
   323     private static final long serialVersionUID = -8627078645895051609L;
   324 
   325     /**
   326      * Generates the initial random seed for the cheaper per-instance
   327      * random number generators used in randomLevel.
   328      */
   329     private static final Random seedGenerator = new Random();
   330 
   331     /**
   332      * Special value used to identify base-level header
   333      */
   334     private static final Object BASE_HEADER = new Object();
   335 
   336     /**
   337      * The topmost head index of the skiplist.
   338      */
   339     private transient volatile HeadIndex<K,V> head;
   340 
   341     /**
   342      * The comparator used to maintain order in this map, or null
   343      * if using natural ordering.
   344      * @serial
   345      */
   346     private final Comparator<? super K> comparator;
   347 
   348     /**
   349      * Seed for simple random number generator.  Not volatile since it
   350      * doesn't matter too much if different threads don't see updates.
   351      */
   352     private transient int randomSeed;
   353 
   354     /** Lazily initialized key set */
   355     private transient KeySet keySet;
   356     /** Lazily initialized entry set */
   357     private transient EntrySet entrySet;
   358     /** Lazily initialized values collection */
   359     private transient Values values;
   360     /** Lazily initialized descending key set */
   361     private transient ConcurrentNavigableMap<K,V> descendingMap;
   362 
   363     /**
   364      * Initializes or resets state. Needed by constructors, clone,
   365      * clear, readObject. and ConcurrentSkipListSet.clone.
   366      * (Note that comparator must be separately initialized.)
   367      */
   368     final void initialize() {
   369         keySet = null;
   370         entrySet = null;
   371         values = null;
   372         descendingMap = null;
   373         randomSeed = seedGenerator.nextInt() | 0x0100; // ensure nonzero
   374         head = new HeadIndex<K,V>(new Node<K,V>(null, BASE_HEADER, null),
   375                                   null, null, 1);
   376     }
   377 
   378     /**
   379      * compareAndSet head node
   380      */
   381     private boolean casHead(HeadIndex<K,V> cmp, HeadIndex<K,V> val) {
   382         return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val);
   383     }
   384 
   385     /* ---------------- Nodes -------------- */
   386 
   387     /**
   388      * Nodes hold keys and values, and are singly linked in sorted
   389      * order, possibly with some intervening marker nodes. The list is
   390      * headed by a dummy node accessible as head.node. The value field
   391      * is declared only as Object because it takes special non-V
   392      * values for marker and header nodes.
   393      */
   394     static final class Node<K,V> {
   395         final K key;
   396         volatile Object value;
   397         volatile Node<K,V> next;
   398 
   399         /**
   400          * Creates a new regular node.
   401          */
   402         Node(K key, Object value, Node<K,V> next) {
   403             this.key = key;
   404             this.value = value;
   405             this.next = next;
   406         }
   407 
   408         /**
   409          * Creates a new marker node. A marker is distinguished by
   410          * having its value field point to itself.  Marker nodes also
   411          * have null keys, a fact that is exploited in a few places,
   412          * but this doesn't distinguish markers from the base-level
   413          * header node (head.node), which also has a null key.
   414          */
   415         Node(Node<K,V> next) {
   416             this.key = null;
   417             this.value = this;
   418             this.next = next;
   419         }
   420 
   421         /**
   422          * compareAndSet value field
   423          */
   424         boolean casValue(Object cmp, Object val) {
   425             return UNSAFE.compareAndSwapObject(this, valueOffset, cmp, val);
   426         }
   427 
   428         /**
   429          * compareAndSet next field
   430          */
   431         boolean casNext(Node<K,V> cmp, Node<K,V> val) {
   432             return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
   433         }
   434 
   435         /**
   436          * Returns true if this node is a marker. This method isn't
   437          * actually called in any current code checking for markers
   438          * because callers will have already read value field and need
   439          * to use that read (not another done here) and so directly
   440          * test if value points to node.
   441          * @param n a possibly null reference to a node
   442          * @return true if this node is a marker node
   443          */
   444         boolean isMarker() {
   445             return value == this;
   446         }
   447 
   448         /**
   449          * Returns true if this node is the header of base-level list.
   450          * @return true if this node is header node
   451          */
   452         boolean isBaseHeader() {
   453             return value == BASE_HEADER;
   454         }
   455 
   456         /**
   457          * Tries to append a deletion marker to this node.
   458          * @param f the assumed current successor of this node
   459          * @return true if successful
   460          */
   461         boolean appendMarker(Node<K,V> f) {
   462             return casNext(f, new Node<K,V>(f));
   463         }
   464 
   465         /**
   466          * Helps out a deletion by appending marker or unlinking from
   467          * predecessor. This is called during traversals when value
   468          * field seen to be null.
   469          * @param b predecessor
   470          * @param f successor
   471          */
   472         void helpDelete(Node<K,V> b, Node<K,V> f) {
   473             /*
   474              * Rechecking links and then doing only one of the
   475              * help-out stages per call tends to minimize CAS
   476              * interference among helping threads.
   477              */
   478             if (f == next && this == b.next) {
   479                 if (f == null || f.value != f) // not already marked
   480                     appendMarker(f);
   481                 else
   482                     b.casNext(this, f.next);
   483             }
   484         }
   485 
   486         /**
   487          * Returns value if this node contains a valid key-value pair,
   488          * else null.
   489          * @return this node's value if it isn't a marker or header or
   490          * is deleted, else null.
   491          */
   492         V getValidValue() {
   493             Object v = value;
   494             if (v == this || v == BASE_HEADER)
   495                 return null;
   496             return (V)v;
   497         }
   498 
   499         /**
   500          * Creates and returns a new SimpleImmutableEntry holding current
   501          * mapping if this node holds a valid value, else null.
   502          * @return new entry or null
   503          */
   504         AbstractMap.SimpleImmutableEntry<K,V> createSnapshot() {
   505             V v = getValidValue();
   506             if (v == null)
   507                 return null;
   508             return new AbstractMap.SimpleImmutableEntry<K,V>(key, v);
   509         }
   510 
   511         // UNSAFE mechanics
   512 
   513         private static final sun.misc.Unsafe UNSAFE;
   514         private static final long valueOffset;
   515         private static final long nextOffset;
   516 
   517         static {
   518             try {
   519                 UNSAFE = sun.misc.Unsafe.getUnsafe();
   520                 Class k = Node.class;
   521                 valueOffset = UNSAFE.objectFieldOffset
   522                     (k.getDeclaredField("value"));
   523                 nextOffset = UNSAFE.objectFieldOffset
   524                     (k.getDeclaredField("next"));
   525             } catch (Exception e) {
   526                 throw new Error(e);
   527             }
   528         }
   529     }
   530 
   531     /* ---------------- Indexing -------------- */
   532 
   533     /**
   534      * Index nodes represent the levels of the skip list.  Note that
   535      * even though both Nodes and Indexes have forward-pointing
   536      * fields, they have different types and are handled in different
   537      * ways, that can't nicely be captured by placing field in a
   538      * shared abstract class.
   539      */
   540     static class Index<K,V> {
   541         final Node<K,V> node;
   542         final Index<K,V> down;
   543         volatile Index<K,V> right;
   544 
   545         /**
   546          * Creates index node with given values.
   547          */
   548         Index(Node<K,V> node, Index<K,V> down, Index<K,V> right) {
   549             this.node = node;
   550             this.down = down;
   551             this.right = right;
   552         }
   553 
   554         /**
   555          * compareAndSet right field
   556          */
   557         final boolean casRight(Index<K,V> cmp, Index<K,V> val) {
   558             return UNSAFE.compareAndSwapObject(this, rightOffset, cmp, val);
   559         }
   560 
   561         /**
   562          * Returns true if the node this indexes has been deleted.
   563          * @return true if indexed node is known to be deleted
   564          */
   565         final boolean indexesDeletedNode() {
   566             return node.value == null;
   567         }
   568 
   569         /**
   570          * Tries to CAS newSucc as successor.  To minimize races with
   571          * unlink that may lose this index node, if the node being
   572          * indexed is known to be deleted, it doesn't try to link in.
   573          * @param succ the expected current successor
   574          * @param newSucc the new successor
   575          * @return true if successful
   576          */
   577         final boolean link(Index<K,V> succ, Index<K,V> newSucc) {
   578             Node<K,V> n = node;
   579             newSucc.right = succ;
   580             return n.value != null && casRight(succ, newSucc);
   581         }
   582 
   583         /**
   584          * Tries to CAS right field to skip over apparent successor
   585          * succ.  Fails (forcing a retraversal by caller) if this node
   586          * is known to be deleted.
   587          * @param succ the expected current successor
   588          * @return true if successful
   589          */
   590         final boolean unlink(Index<K,V> succ) {
   591             return !indexesDeletedNode() && casRight(succ, succ.right);
   592         }
   593 
   594         // Unsafe mechanics
   595         private static final sun.misc.Unsafe UNSAFE;
   596         private static final long rightOffset;
   597         static {
   598             try {
   599                 UNSAFE = sun.misc.Unsafe.getUnsafe();
   600                 Class k = Index.class;
   601                 rightOffset = UNSAFE.objectFieldOffset
   602                     (k.getDeclaredField("right"));
   603             } catch (Exception e) {
   604                 throw new Error(e);
   605             }
   606         }
   607     }
   608 
   609     /* ---------------- Head nodes -------------- */
   610 
   611     /**
   612      * Nodes heading each level keep track of their level.
   613      */
   614     static final class HeadIndex<K,V> extends Index<K,V> {
   615         final int level;
   616         HeadIndex(Node<K,V> node, Index<K,V> down, Index<K,V> right, int level) {
   617             super(node, down, right);
   618             this.level = level;
   619         }
   620     }
   621 
   622     /* ---------------- Comparison utilities -------------- */
   623 
   624     /**
   625      * Represents a key with a comparator as a Comparable.
   626      *
   627      * Because most sorted collections seem to use natural ordering on
   628      * Comparables (Strings, Integers, etc), most internal methods are
   629      * geared to use them. This is generally faster than checking
   630      * per-comparison whether to use comparator or comparable because
   631      * it doesn't require a (Comparable) cast for each comparison.
   632      * (Optimizers can only sometimes remove such redundant checks
   633      * themselves.) When Comparators are used,
   634      * ComparableUsingComparators are created so that they act in the
   635      * same way as natural orderings. This penalizes use of
   636      * Comparators vs Comparables, which seems like the right
   637      * tradeoff.
   638      */
   639     static final class ComparableUsingComparator<K> implements Comparable<K> {
   640         final K actualKey;
   641         final Comparator<? super K> cmp;
   642         ComparableUsingComparator(K key, Comparator<? super K> cmp) {
   643             this.actualKey = key;
   644             this.cmp = cmp;
   645         }
   646         public int compareTo(K k2) {
   647             return cmp.compare(actualKey, k2);
   648         }
   649     }
   650 
   651     /**
   652      * If using comparator, return a ComparableUsingComparator, else
   653      * cast key as Comparable, which may cause ClassCastException,
   654      * which is propagated back to caller.
   655      */
   656     private Comparable<? super K> comparable(Object key)
   657             throws ClassCastException {
   658         if (key == null)
   659             throw new NullPointerException();
   660         if (comparator != null)
   661             return new ComparableUsingComparator<K>((K)key, comparator);
   662         else
   663             return (Comparable<? super K>)key;
   664     }
   665 
   666     /**
   667      * Compares using comparator or natural ordering. Used when the
   668      * ComparableUsingComparator approach doesn't apply.
   669      */
   670     int compare(K k1, K k2) throws ClassCastException {
   671         Comparator<? super K> cmp = comparator;
   672         if (cmp != null)
   673             return cmp.compare(k1, k2);
   674         else
   675             return ((Comparable<? super K>)k1).compareTo(k2);
   676     }
   677 
   678     /**
   679      * Returns true if given key greater than or equal to least and
   680      * strictly less than fence, bypassing either test if least or
   681      * fence are null. Needed mainly in submap operations.
   682      */
   683     boolean inHalfOpenRange(K key, K least, K fence) {
   684         if (key == null)
   685             throw new NullPointerException();
   686         return ((least == null || compare(key, least) >= 0) &&
   687                 (fence == null || compare(key, fence) <  0));
   688     }
   689 
   690     /**
   691      * Returns true if given key greater than or equal to least and less
   692      * or equal to fence. Needed mainly in submap operations.
   693      */
   694     boolean inOpenRange(K key, K least, K fence) {
   695         if (key == null)
   696             throw new NullPointerException();
   697         return ((least == null || compare(key, least) >= 0) &&
   698                 (fence == null || compare(key, fence) <= 0));
   699     }
   700 
   701     /* ---------------- Traversal -------------- */
   702 
   703     /**
   704      * Returns a base-level node with key strictly less than given key,
   705      * or the base-level header if there is no such node.  Also
   706      * unlinks indexes to deleted nodes found along the way.  Callers
   707      * rely on this side-effect of clearing indices to deleted nodes.
   708      * @param key the key
   709      * @return a predecessor of key
   710      */
   711     private Node<K,V> findPredecessor(Comparable<? super K> key) {
   712         if (key == null)
   713             throw new NullPointerException(); // don't postpone errors
   714         for (;;) {
   715             Index<K,V> q = head;
   716             Index<K,V> r = q.right;
   717             for (;;) {
   718                 if (r != null) {
   719                     Node<K,V> n = r.node;
   720                     K k = n.key;
   721                     if (n.value == null) {
   722                         if (!q.unlink(r))
   723                             break;           // restart
   724                         r = q.right;         // reread r
   725                         continue;
   726                     }
   727                     if (key.compareTo(k) > 0) {
   728                         q = r;
   729                         r = r.right;
   730                         continue;
   731                     }
   732                 }
   733                 Index<K,V> d = q.down;
   734                 if (d != null) {
   735                     q = d;
   736                     r = d.right;
   737                 } else
   738                     return q.node;
   739             }
   740         }
   741     }
   742 
   743     /**
   744      * Returns node holding key or null if no such, clearing out any
   745      * deleted nodes seen along the way.  Repeatedly traverses at
   746      * base-level looking for key starting at predecessor returned
   747      * from findPredecessor, processing base-level deletions as
   748      * encountered. Some callers rely on this side-effect of clearing
   749      * deleted nodes.
   750      *
   751      * Restarts occur, at traversal step centered on node n, if:
   752      *
   753      *   (1) After reading n's next field, n is no longer assumed
   754      *       predecessor b's current successor, which means that
   755      *       we don't have a consistent 3-node snapshot and so cannot
   756      *       unlink any subsequent deleted nodes encountered.
   757      *
   758      *   (2) n's value field is null, indicating n is deleted, in
   759      *       which case we help out an ongoing structural deletion
   760      *       before retrying.  Even though there are cases where such
   761      *       unlinking doesn't require restart, they aren't sorted out
   762      *       here because doing so would not usually outweigh cost of
   763      *       restarting.
   764      *
   765      *   (3) n is a marker or n's predecessor's value field is null,
   766      *       indicating (among other possibilities) that
   767      *       findPredecessor returned a deleted node. We can't unlink
   768      *       the node because we don't know its predecessor, so rely
   769      *       on another call to findPredecessor to notice and return
   770      *       some earlier predecessor, which it will do. This check is
   771      *       only strictly needed at beginning of loop, (and the
   772      *       b.value check isn't strictly needed at all) but is done
   773      *       each iteration to help avoid contention with other
   774      *       threads by callers that will fail to be able to change
   775      *       links, and so will retry anyway.
   776      *
   777      * The traversal loops in doPut, doRemove, and findNear all
   778      * include the same three kinds of checks. And specialized
   779      * versions appear in findFirst, and findLast and their
   780      * variants. They can't easily share code because each uses the
   781      * reads of fields held in locals occurring in the orders they
   782      * were performed.
   783      *
   784      * @param key the key
   785      * @return node holding key, or null if no such
   786      */
   787     private Node<K,V> findNode(Comparable<? super K> key) {
   788         for (;;) {
   789             Node<K,V> b = findPredecessor(key);
   790             Node<K,V> n = b.next;
   791             for (;;) {
   792                 if (n == null)
   793                     return null;
   794                 Node<K,V> f = n.next;
   795                 if (n != b.next)                // inconsistent read
   796                     break;
   797                 Object v = n.value;
   798                 if (v == null) {                // n is deleted
   799                     n.helpDelete(b, f);
   800                     break;
   801                 }
   802                 if (v == n || b.value == null)  // b is deleted
   803                     break;
   804                 int c = key.compareTo(n.key);
   805                 if (c == 0)
   806                     return n;
   807                 if (c < 0)
   808                     return null;
   809                 b = n;
   810                 n = f;
   811             }
   812         }
   813     }
   814 
   815     /**
   816      * Gets value for key using findNode.
   817      * @param okey the key
   818      * @return the value, or null if absent
   819      */
   820     private V doGet(Object okey) {
   821         Comparable<? super K> key = comparable(okey);
   822         /*
   823          * Loop needed here and elsewhere in case value field goes
   824          * null just as it is about to be returned, in which case we
   825          * lost a race with a deletion, so must retry.
   826          */
   827         for (;;) {
   828             Node<K,V> n = findNode(key);
   829             if (n == null)
   830                 return null;
   831             Object v = n.value;
   832             if (v != null)
   833                 return (V)v;
   834         }
   835     }
   836 
   837     /* ---------------- Insertion -------------- */
   838 
   839     /**
   840      * Main insertion method.  Adds element if not present, or
   841      * replaces value if present and onlyIfAbsent is false.
   842      * @param kkey the key
   843      * @param value  the value that must be associated with key
   844      * @param onlyIfAbsent if should not insert if already present
   845      * @return the old value, or null if newly inserted
   846      */
   847     private V doPut(K kkey, V value, boolean onlyIfAbsent) {
   848         Comparable<? super K> key = comparable(kkey);
   849         for (;;) {
   850             Node<K,V> b = findPredecessor(key);
   851             Node<K,V> n = b.next;
   852             for (;;) {
   853                 if (n != null) {
   854                     Node<K,V> f = n.next;
   855                     if (n != b.next)               // inconsistent read
   856                         break;
   857                     Object v = n.value;
   858                     if (v == null) {               // n is deleted
   859                         n.helpDelete(b, f);
   860                         break;
   861                     }
   862                     if (v == n || b.value == null) // b is deleted
   863                         break;
   864                     int c = key.compareTo(n.key);
   865                     if (c > 0) {
   866                         b = n;
   867                         n = f;
   868                         continue;
   869                     }
   870                     if (c == 0) {
   871                         if (onlyIfAbsent || n.casValue(v, value))
   872                             return (V)v;
   873                         else
   874                             break; // restart if lost race to replace value
   875                     }
   876                     // else c < 0; fall through
   877                 }
   878 
   879                 Node<K,V> z = new Node<K,V>(kkey, value, n);
   880                 if (!b.casNext(n, z))
   881                     break;         // restart if lost race to append to b
   882                 int level = randomLevel();
   883                 if (level > 0)
   884                     insertIndex(z, level);
   885                 return null;
   886             }
   887         }
   888     }
   889 
   890     /**
   891      * Returns a random level for inserting a new node.
   892      * Hardwired to k=1, p=0.5, max 31 (see above and
   893      * Pugh's "Skip List Cookbook", sec 3.4).
   894      *
   895      * This uses the simplest of the generators described in George
   896      * Marsaglia's "Xorshift RNGs" paper.  This is not a high-quality
   897      * generator but is acceptable here.
   898      */
   899     private int randomLevel() {
   900         int x = randomSeed;
   901         x ^= x << 13;
   902         x ^= x >>> 17;
   903         randomSeed = x ^= x << 5;
   904         if ((x & 0x80000001) != 0) // test highest and lowest bits
   905             return 0;
   906         int level = 1;
   907         while (((x >>>= 1) & 1) != 0) ++level;
   908         return level;
   909     }
   910 
   911     /**
   912      * Creates and adds index nodes for the given node.
   913      * @param z the node
   914      * @param level the level of the index
   915      */
   916     private void insertIndex(Node<K,V> z, int level) {
   917         HeadIndex<K,V> h = head;
   918         int max = h.level;
   919 
   920         if (level <= max) {
   921             Index<K,V> idx = null;
   922             for (int i = 1; i <= level; ++i)
   923                 idx = new Index<K,V>(z, idx, null);
   924             addIndex(idx, h, level);
   925 
   926         } else { // Add a new level
   927             /*
   928              * To reduce interference by other threads checking for
   929              * empty levels in tryReduceLevel, new levels are added
   930              * with initialized right pointers. Which in turn requires
   931              * keeping levels in an array to access them while
   932              * creating new head index nodes from the opposite
   933              * direction.
   934              */
   935             level = max + 1;
   936             Index<K,V>[] idxs = (Index<K,V>[])new Index[level+1];
   937             Index<K,V> idx = null;
   938             for (int i = 1; i <= level; ++i)
   939                 idxs[i] = idx = new Index<K,V>(z, idx, null);
   940 
   941             HeadIndex<K,V> oldh;
   942             int k;
   943             for (;;) {
   944                 oldh = head;
   945                 int oldLevel = oldh.level;
   946                 if (level <= oldLevel) { // lost race to add level
   947                     k = level;
   948                     break;
   949                 }
   950                 HeadIndex<K,V> newh = oldh;
   951                 Node<K,V> oldbase = oldh.node;
   952                 for (int j = oldLevel+1; j <= level; ++j)
   953                     newh = new HeadIndex<K,V>(oldbase, newh, idxs[j], j);
   954                 if (casHead(oldh, newh)) {
   955                     k = oldLevel;
   956                     break;
   957                 }
   958             }
   959             addIndex(idxs[k], oldh, k);
   960         }
   961     }
   962 
   963     /**
   964      * Adds given index nodes from given level down to 1.
   965      * @param idx the topmost index node being inserted
   966      * @param h the value of head to use to insert. This must be
   967      * snapshotted by callers to provide correct insertion level
   968      * @param indexLevel the level of the index
   969      */
   970     private void addIndex(Index<K,V> idx, HeadIndex<K,V> h, int indexLevel) {
   971         // Track next level to insert in case of retries
   972         int insertionLevel = indexLevel;
   973         Comparable<? super K> key = comparable(idx.node.key);
   974         if (key == null) throw new NullPointerException();
   975 
   976         // Similar to findPredecessor, but adding index nodes along
   977         // path to key.
   978         for (;;) {
   979             int j = h.level;
   980             Index<K,V> q = h;
   981             Index<K,V> r = q.right;
   982             Index<K,V> t = idx;
   983             for (;;) {
   984                 if (r != null) {
   985                     Node<K,V> n = r.node;
   986                     // compare before deletion check avoids needing recheck
   987                     int c = key.compareTo(n.key);
   988                     if (n.value == null) {
   989                         if (!q.unlink(r))
   990                             break;
   991                         r = q.right;
   992                         continue;
   993                     }
   994                     if (c > 0) {
   995                         q = r;
   996                         r = r.right;
   997                         continue;
   998                     }
   999                 }
  1000 
  1001                 if (j == insertionLevel) {
  1002                     // Don't insert index if node already deleted
  1003                     if (t.indexesDeletedNode()) {
  1004                         findNode(key); // cleans up
  1005                         return;
  1006                     }
  1007                     if (!q.link(r, t))
  1008                         break; // restart
  1009                     if (--insertionLevel == 0) {
  1010                         // need final deletion check before return
  1011                         if (t.indexesDeletedNode())
  1012                             findNode(key);
  1013                         return;
  1014                     }
  1015                 }
  1016 
  1017                 if (--j >= insertionLevel && j < indexLevel)
  1018                     t = t.down;
  1019                 q = q.down;
  1020                 r = q.right;
  1021             }
  1022         }
  1023     }
  1024 
  1025     /* ---------------- Deletion -------------- */
  1026 
  1027     /**
  1028      * Main deletion method. Locates node, nulls value, appends a
  1029      * deletion marker, unlinks predecessor, removes associated index
  1030      * nodes, and possibly reduces head index level.
  1031      *
  1032      * Index nodes are cleared out simply by calling findPredecessor.
  1033      * which unlinks indexes to deleted nodes found along path to key,
  1034      * which will include the indexes to this node.  This is done
  1035      * unconditionally. We can't check beforehand whether there are
  1036      * index nodes because it might be the case that some or all
  1037      * indexes hadn't been inserted yet for this node during initial
  1038      * search for it, and we'd like to ensure lack of garbage
  1039      * retention, so must call to be sure.
  1040      *
  1041      * @param okey the key
  1042      * @param value if non-null, the value that must be
  1043      * associated with key
  1044      * @return the node, or null if not found
  1045      */
  1046     final V doRemove(Object okey, Object value) {
  1047         Comparable<? super K> key = comparable(okey);
  1048         for (;;) {
  1049             Node<K,V> b = findPredecessor(key);
  1050             Node<K,V> n = b.next;
  1051             for (;;) {
  1052                 if (n == null)
  1053                     return null;
  1054                 Node<K,V> f = n.next;
  1055                 if (n != b.next)                    // inconsistent read
  1056                     break;
  1057                 Object v = n.value;
  1058                 if (v == null) {                    // n is deleted
  1059                     n.helpDelete(b, f);
  1060                     break;
  1061                 }
  1062                 if (v == n || b.value == null)      // b is deleted
  1063                     break;
  1064                 int c = key.compareTo(n.key);
  1065                 if (c < 0)
  1066                     return null;
  1067                 if (c > 0) {
  1068                     b = n;
  1069                     n = f;
  1070                     continue;
  1071                 }
  1072                 if (value != null && !value.equals(v))
  1073                     return null;
  1074                 if (!n.casValue(v, null))
  1075                     break;
  1076                 if (!n.appendMarker(f) || !b.casNext(n, f))
  1077                     findNode(key);                  // Retry via findNode
  1078                 else {
  1079                     findPredecessor(key);           // Clean index
  1080                     if (head.right == null)
  1081                         tryReduceLevel();
  1082                 }
  1083                 return (V)v;
  1084             }
  1085         }
  1086     }
  1087 
  1088     /**
  1089      * Possibly reduce head level if it has no nodes.  This method can
  1090      * (rarely) make mistakes, in which case levels can disappear even
  1091      * though they are about to contain index nodes. This impacts
  1092      * performance, not correctness.  To minimize mistakes as well as
  1093      * to reduce hysteresis, the level is reduced by one only if the
  1094      * topmost three levels look empty. Also, if the removed level
  1095      * looks non-empty after CAS, we try to change it back quick
  1096      * before anyone notices our mistake! (This trick works pretty
  1097      * well because this method will practically never make mistakes
  1098      * unless current thread stalls immediately before first CAS, in
  1099      * which case it is very unlikely to stall again immediately
  1100      * afterwards, so will recover.)
  1101      *
  1102      * We put up with all this rather than just let levels grow
  1103      * because otherwise, even a small map that has undergone a large
  1104      * number of insertions and removals will have a lot of levels,
  1105      * slowing down access more than would an occasional unwanted
  1106      * reduction.
  1107      */
  1108     private void tryReduceLevel() {
  1109         HeadIndex<K,V> h = head;
  1110         HeadIndex<K,V> d;
  1111         HeadIndex<K,V> e;
  1112         if (h.level > 3 &&
  1113             (d = (HeadIndex<K,V>)h.down) != null &&
  1114             (e = (HeadIndex<K,V>)d.down) != null &&
  1115             e.right == null &&
  1116             d.right == null &&
  1117             h.right == null &&
  1118             casHead(h, d) && // try to set
  1119             h.right != null) // recheck
  1120             casHead(d, h);   // try to backout
  1121     }
  1122 
  1123     /* ---------------- Finding and removing first element -------------- */
  1124 
  1125     /**
  1126      * Specialized variant of findNode to get first valid node.
  1127      * @return first node or null if empty
  1128      */
  1129     Node<K,V> findFirst() {
  1130         for (;;) {
  1131             Node<K,V> b = head.node;
  1132             Node<K,V> n = b.next;
  1133             if (n == null)
  1134                 return null;
  1135             if (n.value != null)
  1136                 return n;
  1137             n.helpDelete(b, n.next);
  1138         }
  1139     }
  1140 
  1141     /**
  1142      * Removes first entry; returns its snapshot.
  1143      * @return null if empty, else snapshot of first entry
  1144      */
  1145     Map.Entry<K,V> doRemoveFirstEntry() {
  1146         for (;;) {
  1147             Node<K,V> b = head.node;
  1148             Node<K,V> n = b.next;
  1149             if (n == null)
  1150                 return null;
  1151             Node<K,V> f = n.next;
  1152             if (n != b.next)
  1153                 continue;
  1154             Object v = n.value;
  1155             if (v == null) {
  1156                 n.helpDelete(b, f);
  1157                 continue;
  1158             }
  1159             if (!n.casValue(v, null))
  1160                 continue;
  1161             if (!n.appendMarker(f) || !b.casNext(n, f))
  1162                 findFirst(); // retry
  1163             clearIndexToFirst();
  1164             return new AbstractMap.SimpleImmutableEntry<K,V>(n.key, (V)v);
  1165         }
  1166     }
  1167 
  1168     /**
  1169      * Clears out index nodes associated with deleted first entry.
  1170      */
  1171     private void clearIndexToFirst() {
  1172         for (;;) {
  1173             Index<K,V> q = head;
  1174             for (;;) {
  1175                 Index<K,V> r = q.right;
  1176                 if (r != null && r.indexesDeletedNode() && !q.unlink(r))
  1177                     break;
  1178                 if ((q = q.down) == null) {
  1179                     if (head.right == null)
  1180                         tryReduceLevel();
  1181                     return;
  1182                 }
  1183             }
  1184         }
  1185     }
  1186 
  1187 
  1188     /* ---------------- Finding and removing last element -------------- */
  1189 
  1190     /**
  1191      * Specialized version of find to get last valid node.
  1192      * @return last node or null if empty
  1193      */
  1194     Node<K,V> findLast() {
  1195         /*
  1196          * findPredecessor can't be used to traverse index level
  1197          * because this doesn't use comparisons.  So traversals of
  1198          * both levels are folded together.
  1199          */
  1200         Index<K,V> q = head;
  1201         for (;;) {
  1202             Index<K,V> d, r;
  1203             if ((r = q.right) != null) {
  1204                 if (r.indexesDeletedNode()) {
  1205                     q.unlink(r);
  1206                     q = head; // restart
  1207                 }
  1208                 else
  1209                     q = r;
  1210             } else if ((d = q.down) != null) {
  1211                 q = d;
  1212             } else {
  1213                 Node<K,V> b = q.node;
  1214                 Node<K,V> n = b.next;
  1215                 for (;;) {
  1216                     if (n == null)
  1217                         return b.isBaseHeader() ? null : b;
  1218                     Node<K,V> f = n.next;            // inconsistent read
  1219                     if (n != b.next)
  1220                         break;
  1221                     Object v = n.value;
  1222                     if (v == null) {                 // n is deleted
  1223                         n.helpDelete(b, f);
  1224                         break;
  1225                     }
  1226                     if (v == n || b.value == null)   // b is deleted
  1227                         break;
  1228                     b = n;
  1229                     n = f;
  1230                 }
  1231                 q = head; // restart
  1232             }
  1233         }
  1234     }
  1235 
  1236     /**
  1237      * Specialized variant of findPredecessor to get predecessor of last
  1238      * valid node.  Needed when removing the last entry.  It is possible
  1239      * that all successors of returned node will have been deleted upon
  1240      * return, in which case this method can be retried.
  1241      * @return likely predecessor of last node
  1242      */
  1243     private Node<K,V> findPredecessorOfLast() {
  1244         for (;;) {
  1245             Index<K,V> q = head;
  1246             for (;;) {
  1247                 Index<K,V> d, r;
  1248                 if ((r = q.right) != null) {
  1249                     if (r.indexesDeletedNode()) {
  1250                         q.unlink(r);
  1251                         break;    // must restart
  1252                     }
  1253                     // proceed as far across as possible without overshooting
  1254                     if (r.node.next != null) {
  1255                         q = r;
  1256                         continue;
  1257                     }
  1258                 }
  1259                 if ((d = q.down) != null)
  1260                     q = d;
  1261                 else
  1262                     return q.node;
  1263             }
  1264         }
  1265     }
  1266 
  1267     /**
  1268      * Removes last entry; returns its snapshot.
  1269      * Specialized variant of doRemove.
  1270      * @return null if empty, else snapshot of last entry
  1271      */
  1272     Map.Entry<K,V> doRemoveLastEntry() {
  1273         for (;;) {
  1274             Node<K,V> b = findPredecessorOfLast();
  1275             Node<K,V> n = b.next;
  1276             if (n == null) {
  1277                 if (b.isBaseHeader())               // empty
  1278                     return null;
  1279                 else
  1280                     continue; // all b's successors are deleted; retry
  1281             }
  1282             for (;;) {
  1283                 Node<K,V> f = n.next;
  1284                 if (n != b.next)                    // inconsistent read
  1285                     break;
  1286                 Object v = n.value;
  1287                 if (v == null) {                    // n is deleted
  1288                     n.helpDelete(b, f);
  1289                     break;
  1290                 }
  1291                 if (v == n || b.value == null)      // b is deleted
  1292                     break;
  1293                 if (f != null) {
  1294                     b = n;
  1295                     n = f;
  1296                     continue;
  1297                 }
  1298                 if (!n.casValue(v, null))
  1299                     break;
  1300                 K key = n.key;
  1301                 Comparable<? super K> ck = comparable(key);
  1302                 if (!n.appendMarker(f) || !b.casNext(n, f))
  1303                     findNode(ck);                  // Retry via findNode
  1304                 else {
  1305                     findPredecessor(ck);           // Clean index
  1306                     if (head.right == null)
  1307                         tryReduceLevel();
  1308                 }
  1309                 return new AbstractMap.SimpleImmutableEntry<K,V>(key, (V)v);
  1310             }
  1311         }
  1312     }
  1313 
  1314     /* ---------------- Relational operations -------------- */
  1315 
  1316     // Control values OR'ed as arguments to findNear
  1317 
  1318     private static final int EQ = 1;
  1319     private static final int LT = 2;
  1320     private static final int GT = 0; // Actually checked as !LT
  1321 
  1322     /**
  1323      * Utility for ceiling, floor, lower, higher methods.
  1324      * @param kkey the key
  1325      * @param rel the relation -- OR'ed combination of EQ, LT, GT
  1326      * @return nearest node fitting relation, or null if no such
  1327      */
  1328     Node<K,V> findNear(K kkey, int rel) {
  1329         Comparable<? super K> key = comparable(kkey);
  1330         for (;;) {
  1331             Node<K,V> b = findPredecessor(key);
  1332             Node<K,V> n = b.next;
  1333             for (;;) {
  1334                 if (n == null)
  1335                     return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b;
  1336                 Node<K,V> f = n.next;
  1337                 if (n != b.next)                  // inconsistent read
  1338                     break;
  1339                 Object v = n.value;
  1340                 if (v == null) {                  // n is deleted
  1341                     n.helpDelete(b, f);
  1342                     break;
  1343                 }
  1344                 if (v == n || b.value == null)    // b is deleted
  1345                     break;
  1346                 int c = key.compareTo(n.key);
  1347                 if ((c == 0 && (rel & EQ) != 0) ||
  1348                     (c <  0 && (rel & LT) == 0))
  1349                     return n;
  1350                 if ( c <= 0 && (rel & LT) != 0)
  1351                     return b.isBaseHeader() ? null : b;
  1352                 b = n;
  1353                 n = f;
  1354             }
  1355         }
  1356     }
  1357 
  1358     /**
  1359      * Returns SimpleImmutableEntry for results of findNear.
  1360      * @param key the key
  1361      * @param rel the relation -- OR'ed combination of EQ, LT, GT
  1362      * @return Entry fitting relation, or null if no such
  1363      */
  1364     AbstractMap.SimpleImmutableEntry<K,V> getNear(K key, int rel) {
  1365         for (;;) {
  1366             Node<K,V> n = findNear(key, rel);
  1367             if (n == null)
  1368                 return null;
  1369             AbstractMap.SimpleImmutableEntry<K,V> e = n.createSnapshot();
  1370             if (e != null)
  1371                 return e;
  1372         }
  1373     }
  1374 
  1375 
  1376     /* ---------------- Constructors -------------- */
  1377 
  1378     /**
  1379      * Constructs a new, empty map, sorted according to the
  1380      * {@linkplain Comparable natural ordering} of the keys.
  1381      */
  1382     public ConcurrentSkipListMap() {
  1383         this.comparator = null;
  1384         initialize();
  1385     }
  1386 
  1387     /**
  1388      * Constructs a new, empty map, sorted according to the specified
  1389      * comparator.
  1390      *
  1391      * @param comparator the comparator that will be used to order this map.
  1392      *        If <tt>null</tt>, the {@linkplain Comparable natural
  1393      *        ordering} of the keys will be used.
  1394      */
  1395     public ConcurrentSkipListMap(Comparator<? super K> comparator) {
  1396         this.comparator = comparator;
  1397         initialize();
  1398     }
  1399 
  1400     /**
  1401      * Constructs a new map containing the same mappings as the given map,
  1402      * sorted according to the {@linkplain Comparable natural ordering} of
  1403      * the keys.
  1404      *
  1405      * @param  m the map whose mappings are to be placed in this map
  1406      * @throws ClassCastException if the keys in <tt>m</tt> are not
  1407      *         {@link Comparable}, or are not mutually comparable
  1408      * @throws NullPointerException if the specified map or any of its keys
  1409      *         or values are null
  1410      */
  1411     public ConcurrentSkipListMap(Map<? extends K, ? extends V> m) {
  1412         this.comparator = null;
  1413         initialize();
  1414         putAll(m);
  1415     }
  1416 
  1417     /**
  1418      * Constructs a new map containing the same mappings and using the
  1419      * same ordering as the specified sorted map.
  1420      *
  1421      * @param m the sorted map whose mappings are to be placed in this
  1422      *        map, and whose comparator is to be used to sort this map
  1423      * @throws NullPointerException if the specified sorted map or any of
  1424      *         its keys or values are null
  1425      */
  1426     public ConcurrentSkipListMap(SortedMap<K, ? extends V> m) {
  1427         this.comparator = m.comparator();
  1428         initialize();
  1429         buildFromSorted(m);
  1430     }
  1431 
  1432     /**
  1433      * Returns a shallow copy of this <tt>ConcurrentSkipListMap</tt>
  1434      * instance. (The keys and values themselves are not cloned.)
  1435      *
  1436      * @return a shallow copy of this map
  1437      */
  1438     public ConcurrentSkipListMap<K,V> clone() {
  1439         ConcurrentSkipListMap<K,V> clone = null;
  1440         try {
  1441             clone = (ConcurrentSkipListMap<K,V>) super.clone();
  1442         } catch (CloneNotSupportedException e) {
  1443             throw new InternalError();
  1444         }
  1445 
  1446         clone.initialize();
  1447         clone.buildFromSorted(this);
  1448         return clone;
  1449     }
  1450 
  1451     /**
  1452      * Streamlined bulk insertion to initialize from elements of
  1453      * given sorted map.  Call only from constructor or clone
  1454      * method.
  1455      */
  1456     private void buildFromSorted(SortedMap<K, ? extends V> map) {
  1457         if (map == null)
  1458             throw new NullPointerException();
  1459 
  1460         HeadIndex<K,V> h = head;
  1461         Node<K,V> basepred = h.node;
  1462 
  1463         // Track the current rightmost node at each level. Uses an
  1464         // ArrayList to avoid committing to initial or maximum level.
  1465         ArrayList<Index<K,V>> preds = new ArrayList<Index<K,V>>();
  1466 
  1467         // initialize
  1468         for (int i = 0; i <= h.level; ++i)
  1469             preds.add(null);
  1470         Index<K,V> q = h;
  1471         for (int i = h.level; i > 0; --i) {
  1472             preds.set(i, q);
  1473             q = q.down;
  1474         }
  1475 
  1476         Iterator<? extends Map.Entry<? extends K, ? extends V>> it =
  1477             map.entrySet().iterator();
  1478         while (it.hasNext()) {
  1479             Map.Entry<? extends K, ? extends V> e = it.next();
  1480             int j = randomLevel();
  1481             if (j > h.level) j = h.level + 1;
  1482             K k = e.getKey();
  1483             V v = e.getValue();
  1484             if (k == null || v == null)
  1485                 throw new NullPointerException();
  1486             Node<K,V> z = new Node<K,V>(k, v, null);
  1487             basepred.next = z;
  1488             basepred = z;
  1489             if (j > 0) {
  1490                 Index<K,V> idx = null;
  1491                 for (int i = 1; i <= j; ++i) {
  1492                     idx = new Index<K,V>(z, idx, null);
  1493                     if (i > h.level)
  1494                         h = new HeadIndex<K,V>(h.node, h, idx, i);
  1495 
  1496                     if (i < preds.size()) {
  1497                         preds.get(i).right = idx;
  1498                         preds.set(i, idx);
  1499                     } else
  1500                         preds.add(idx);
  1501                 }
  1502             }
  1503         }
  1504         head = h;
  1505     }
  1506 
  1507     /* ---------------- Serialization -------------- */
  1508 
  1509     /**
  1510      * Save the state of this map to a stream.
  1511      *
  1512      * @serialData The key (Object) and value (Object) for each
  1513      * key-value mapping represented by the map, followed by
  1514      * <tt>null</tt>. The key-value mappings are emitted in key-order
  1515      * (as determined by the Comparator, or by the keys' natural
  1516      * ordering if no Comparator).
  1517      */
  1518     private void writeObject(java.io.ObjectOutputStream s)
  1519         throws java.io.IOException {
  1520         // Write out the Comparator and any hidden stuff
  1521         s.defaultWriteObject();
  1522 
  1523         // Write out keys and values (alternating)
  1524         for (Node<K,V> n = findFirst(); n != null; n = n.next) {
  1525             V v = n.getValidValue();
  1526             if (v != null) {
  1527                 s.writeObject(n.key);
  1528                 s.writeObject(v);
  1529             }
  1530         }
  1531         s.writeObject(null);
  1532     }
  1533 
  1534     /**
  1535      * Reconstitute the map from a stream.
  1536      */
  1537     private void readObject(final java.io.ObjectInputStream s)
  1538         throws java.io.IOException, ClassNotFoundException {
  1539         // Read in the Comparator and any hidden stuff
  1540         s.defaultReadObject();
  1541         // Reset transients
  1542         initialize();
  1543 
  1544         /*
  1545          * This is nearly identical to buildFromSorted, but is
  1546          * distinct because readObject calls can't be nicely adapted
  1547          * as the kind of iterator needed by buildFromSorted. (They
  1548          * can be, but doing so requires type cheats and/or creation
  1549          * of adaptor classes.) It is simpler to just adapt the code.
  1550          */
  1551 
  1552         HeadIndex<K,V> h = head;
  1553         Node<K,V> basepred = h.node;
  1554         ArrayList<Index<K,V>> preds = new ArrayList<Index<K,V>>();
  1555         for (int i = 0; i <= h.level; ++i)
  1556             preds.add(null);
  1557         Index<K,V> q = h;
  1558         for (int i = h.level; i > 0; --i) {
  1559             preds.set(i, q);
  1560             q = q.down;
  1561         }
  1562 
  1563         for (;;) {
  1564             Object k = s.readObject();
  1565             if (k == null)
  1566                 break;
  1567             Object v = s.readObject();
  1568             if (v == null)
  1569                 throw new NullPointerException();
  1570             K key = (K) k;
  1571             V val = (V) v;
  1572             int j = randomLevel();
  1573             if (j > h.level) j = h.level + 1;
  1574             Node<K,V> z = new Node<K,V>(key, val, null);
  1575             basepred.next = z;
  1576             basepred = z;
  1577             if (j > 0) {
  1578                 Index<K,V> idx = null;
  1579                 for (int i = 1; i <= j; ++i) {
  1580                     idx = new Index<K,V>(z, idx, null);
  1581                     if (i > h.level)
  1582                         h = new HeadIndex<K,V>(h.node, h, idx, i);
  1583 
  1584                     if (i < preds.size()) {
  1585                         preds.get(i).right = idx;
  1586                         preds.set(i, idx);
  1587                     } else
  1588                         preds.add(idx);
  1589                 }
  1590             }
  1591         }
  1592         head = h;
  1593     }
  1594 
  1595     /* ------ Map API methods ------ */
  1596 
  1597     /**
  1598      * Returns <tt>true</tt> if this map contains a mapping for the specified
  1599      * key.
  1600      *
  1601      * @param key key whose presence in this map is to be tested
  1602      * @return <tt>true</tt> if this map contains a mapping for the specified key
  1603      * @throws ClassCastException if the specified key cannot be compared
  1604      *         with the keys currently in the map
  1605      * @throws NullPointerException if the specified key is null
  1606      */
  1607     public boolean containsKey(Object key) {
  1608         return doGet(key) != null;
  1609     }
  1610 
  1611     /**
  1612      * Returns the value to which the specified key is mapped,
  1613      * or {@code null} if this map contains no mapping for the key.
  1614      *
  1615      * <p>More formally, if this map contains a mapping from a key
  1616      * {@code k} to a value {@code v} such that {@code key} compares
  1617      * equal to {@code k} according to the map's ordering, then this
  1618      * method returns {@code v}; otherwise it returns {@code null}.
  1619      * (There can be at most one such mapping.)
  1620      *
  1621      * @throws ClassCastException if the specified key cannot be compared
  1622      *         with the keys currently in the map
  1623      * @throws NullPointerException if the specified key is null
  1624      */
  1625     public V get(Object key) {
  1626         return doGet(key);
  1627     }
  1628 
  1629     /**
  1630      * Associates the specified value with the specified key in this map.
  1631      * If the map previously contained a mapping for the key, the old
  1632      * value is replaced.
  1633      *
  1634      * @param key key with which the specified value is to be associated
  1635      * @param value value to be associated with the specified key
  1636      * @return the previous value associated with the specified key, or
  1637      *         <tt>null</tt> if there was no mapping for the key
  1638      * @throws ClassCastException if the specified key cannot be compared
  1639      *         with the keys currently in the map
  1640      * @throws NullPointerException if the specified key or value is null
  1641      */
  1642     public V put(K key, V value) {
  1643         if (value == null)
  1644             throw new NullPointerException();
  1645         return doPut(key, value, false);
  1646     }
  1647 
  1648     /**
  1649      * Removes the mapping for the specified key from this map if present.
  1650      *
  1651      * @param  key key for which mapping should be removed
  1652      * @return the previous value associated with the specified key, or
  1653      *         <tt>null</tt> if there was no mapping for the key
  1654      * @throws ClassCastException if the specified key cannot be compared
  1655      *         with the keys currently in the map
  1656      * @throws NullPointerException if the specified key is null
  1657      */
  1658     public V remove(Object key) {
  1659         return doRemove(key, null);
  1660     }
  1661 
  1662     /**
  1663      * Returns <tt>true</tt> if this map maps one or more keys to the
  1664      * specified value.  This operation requires time linear in the
  1665      * map size. Additionally, it is possible for the map to change
  1666      * during execution of this method, in which case the returned
  1667      * result may be inaccurate.
  1668      *
  1669      * @param value value whose presence in this map is to be tested
  1670      * @return <tt>true</tt> if a mapping to <tt>value</tt> exists;
  1671      *         <tt>false</tt> otherwise
  1672      * @throws NullPointerException if the specified value is null
  1673      */
  1674     public boolean containsValue(Object value) {
  1675         if (value == null)
  1676             throw new NullPointerException();
  1677         for (Node<K,V> n = findFirst(); n != null; n = n.next) {
  1678             V v = n.getValidValue();
  1679             if (v != null && value.equals(v))
  1680                 return true;
  1681         }
  1682         return false;
  1683     }
  1684 
  1685     /**
  1686      * Returns the number of key-value mappings in this map.  If this map
  1687      * contains more than <tt>Integer.MAX_VALUE</tt> elements, it
  1688      * returns <tt>Integer.MAX_VALUE</tt>.
  1689      *
  1690      * <p>Beware that, unlike in most collections, this method is
  1691      * <em>NOT</em> a constant-time operation. Because of the
  1692      * asynchronous nature of these maps, determining the current
  1693      * number of elements requires traversing them all to count them.
  1694      * Additionally, it is possible for the size to change during
  1695      * execution of this method, in which case the returned result
  1696      * will be inaccurate. Thus, this method is typically not very
  1697      * useful in concurrent applications.
  1698      *
  1699      * @return the number of elements in this map
  1700      */
  1701     public int size() {
  1702         long count = 0;
  1703         for (Node<K,V> n = findFirst(); n != null; n = n.next) {
  1704             if (n.getValidValue() != null)
  1705                 ++count;
  1706         }
  1707         return (count >= Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) count;
  1708     }
  1709 
  1710     /**
  1711      * Returns <tt>true</tt> if this map contains no key-value mappings.
  1712      * @return <tt>true</tt> if this map contains no key-value mappings
  1713      */
  1714     public boolean isEmpty() {
  1715         return findFirst() == null;
  1716     }
  1717 
  1718     /**
  1719      * Removes all of the mappings from this map.
  1720      */
  1721     public void clear() {
  1722         initialize();
  1723     }
  1724 
  1725     /* ---------------- View methods -------------- */
  1726 
  1727     /*
  1728      * Note: Lazy initialization works for views because view classes
  1729      * are stateless/immutable so it doesn't matter wrt correctness if
  1730      * more than one is created (which will only rarely happen).  Even
  1731      * so, the following idiom conservatively ensures that the method
  1732      * returns the one it created if it does so, not one created by
  1733      * another racing thread.
  1734      */
  1735 
  1736     /**
  1737      * Returns a {@link NavigableSet} view of the keys contained in this map.
  1738      * The set's iterator returns the keys in ascending order.
  1739      * The set is backed by the map, so changes to the map are
  1740      * reflected in the set, and vice-versa.  The set supports element
  1741      * removal, which removes the corresponding mapping from the map,
  1742      * via the {@code Iterator.remove}, {@code Set.remove},
  1743      * {@code removeAll}, {@code retainAll}, and {@code clear}
  1744      * operations.  It does not support the {@code add} or {@code addAll}
  1745      * operations.
  1746      *
  1747      * <p>The view's {@code iterator} is a "weakly consistent" iterator
  1748      * that will never throw {@link ConcurrentModificationException},
  1749      * and guarantees to traverse elements as they existed upon
  1750      * construction of the iterator, and may (but is not guaranteed to)
  1751      * reflect any modifications subsequent to construction.
  1752      *
  1753      * <p>This method is equivalent to method {@code navigableKeySet}.
  1754      *
  1755      * @return a navigable set view of the keys in this map
  1756      */
  1757     public NavigableSet<K> keySet() {
  1758         KeySet ks = keySet;
  1759         return (ks != null) ? ks : (keySet = new KeySet(this));
  1760     }
  1761 
  1762     public NavigableSet<K> navigableKeySet() {
  1763         KeySet ks = keySet;
  1764         return (ks != null) ? ks : (keySet = new KeySet(this));
  1765     }
  1766 
  1767     /**
  1768      * Returns a {@link Collection} view of the values contained in this map.
  1769      * The collection's iterator returns the values in ascending order
  1770      * of the corresponding keys.
  1771      * The collection is backed by the map, so changes to the map are
  1772      * reflected in the collection, and vice-versa.  The collection
  1773      * supports element removal, which removes the corresponding
  1774      * mapping from the map, via the <tt>Iterator.remove</tt>,
  1775      * <tt>Collection.remove</tt>, <tt>removeAll</tt>,
  1776      * <tt>retainAll</tt> and <tt>clear</tt> operations.  It does not
  1777      * support the <tt>add</tt> or <tt>addAll</tt> operations.
  1778      *
  1779      * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
  1780      * that will never throw {@link ConcurrentModificationException},
  1781      * and guarantees to traverse elements as they existed upon
  1782      * construction of the iterator, and may (but is not guaranteed to)
  1783      * reflect any modifications subsequent to construction.
  1784      */
  1785     public Collection<V> values() {
  1786         Values vs = values;
  1787         return (vs != null) ? vs : (values = new Values(this));
  1788     }
  1789 
  1790     /**
  1791      * Returns a {@link Set} view of the mappings contained in this map.
  1792      * The set's iterator returns the entries in ascending key order.
  1793      * The set is backed by the map, so changes to the map are
  1794      * reflected in the set, and vice-versa.  The set supports element
  1795      * removal, which removes the corresponding mapping from the map,
  1796      * via the <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
  1797      * <tt>removeAll</tt>, <tt>retainAll</tt> and <tt>clear</tt>
  1798      * operations.  It does not support the <tt>add</tt> or
  1799      * <tt>addAll</tt> operations.
  1800      *
  1801      * <p>The view's <tt>iterator</tt> is a "weakly consistent" iterator
  1802      * that will never throw {@link ConcurrentModificationException},
  1803      * and guarantees to traverse elements as they existed upon
  1804      * construction of the iterator, and may (but is not guaranteed to)
  1805      * reflect any modifications subsequent to construction.
  1806      *
  1807      * <p>The <tt>Map.Entry</tt> elements returned by
  1808      * <tt>iterator.next()</tt> do <em>not</em> support the
  1809      * <tt>setValue</tt> operation.
  1810      *
  1811      * @return a set view of the mappings contained in this map,
  1812      *         sorted in ascending key order
  1813      */
  1814     public Set<Map.Entry<K,V>> entrySet() {
  1815         EntrySet es = entrySet;
  1816         return (es != null) ? es : (entrySet = new EntrySet(this));
  1817     }
  1818 
  1819     public ConcurrentNavigableMap<K,V> descendingMap() {
  1820         ConcurrentNavigableMap<K,V> dm = descendingMap;
  1821         return (dm != null) ? dm : (descendingMap = new SubMap<K,V>
  1822                                     (this, null, false, null, false, true));
  1823     }
  1824 
  1825     public NavigableSet<K> descendingKeySet() {
  1826         return descendingMap().navigableKeySet();
  1827     }
  1828 
  1829     /* ---------------- AbstractMap Overrides -------------- */
  1830 
  1831     /**
  1832      * Compares the specified object with this map for equality.
  1833      * Returns <tt>true</tt> if the given object is also a map and the
  1834      * two maps represent the same mappings.  More formally, two maps
  1835      * <tt>m1</tt> and <tt>m2</tt> represent the same mappings if
  1836      * <tt>m1.entrySet().equals(m2.entrySet())</tt>.  This
  1837      * operation may return misleading results if either map is
  1838      * concurrently modified during execution of this method.
  1839      *
  1840      * @param o object to be compared for equality with this map
  1841      * @return <tt>true</tt> if the specified object is equal to this map
  1842      */
  1843     public boolean equals(Object o) {
  1844         if (o == this)
  1845             return true;
  1846         if (!(o instanceof Map))
  1847             return false;
  1848         Map<?,?> m = (Map<?,?>) o;
  1849         try {
  1850             for (Map.Entry<K,V> e : this.entrySet())
  1851                 if (! e.getValue().equals(m.get(e.getKey())))
  1852                     return false;
  1853             for (Map.Entry<?,?> e : m.entrySet()) {
  1854                 Object k = e.getKey();
  1855                 Object v = e.getValue();
  1856                 if (k == null || v == null || !v.equals(get(k)))
  1857                     return false;
  1858             }
  1859             return true;
  1860         } catch (ClassCastException unused) {
  1861             return false;
  1862         } catch (NullPointerException unused) {
  1863             return false;
  1864         }
  1865     }
  1866 
  1867     /* ------ ConcurrentMap API methods ------ */
  1868 
  1869     /**
  1870      * {@inheritDoc}
  1871      *
  1872      * @return the previous value associated with the specified key,
  1873      *         or <tt>null</tt> if there was no mapping for the key
  1874      * @throws ClassCastException if the specified key cannot be compared
  1875      *         with the keys currently in the map
  1876      * @throws NullPointerException if the specified key or value is null
  1877      */
  1878     public V putIfAbsent(K key, V value) {
  1879         if (value == null)
  1880             throw new NullPointerException();
  1881         return doPut(key, value, true);
  1882     }
  1883 
  1884     /**
  1885      * {@inheritDoc}
  1886      *
  1887      * @throws ClassCastException if the specified key cannot be compared
  1888      *         with the keys currently in the map
  1889      * @throws NullPointerException if the specified key is null
  1890      */
  1891     public boolean remove(Object key, Object value) {
  1892         if (key == null)
  1893             throw new NullPointerException();
  1894         if (value == null)
  1895             return false;
  1896         return doRemove(key, value) != null;
  1897     }
  1898 
  1899     /**
  1900      * {@inheritDoc}
  1901      *
  1902      * @throws ClassCastException if the specified key cannot be compared
  1903      *         with the keys currently in the map
  1904      * @throws NullPointerException if any of the arguments are null
  1905      */
  1906     public boolean replace(K key, V oldValue, V newValue) {
  1907         if (oldValue == null || newValue == null)
  1908             throw new NullPointerException();
  1909         Comparable<? super K> k = comparable(key);
  1910         for (;;) {
  1911             Node<K,V> n = findNode(k);
  1912             if (n == null)
  1913                 return false;
  1914             Object v = n.value;
  1915             if (v != null) {
  1916                 if (!oldValue.equals(v))
  1917                     return false;
  1918                 if (n.casValue(v, newValue))
  1919                     return true;
  1920             }
  1921         }
  1922     }
  1923 
  1924     /**
  1925      * {@inheritDoc}
  1926      *
  1927      * @return the previous value associated with the specified key,
  1928      *         or <tt>null</tt> if there was no mapping for the key
  1929      * @throws ClassCastException if the specified key cannot be compared
  1930      *         with the keys currently in the map
  1931      * @throws NullPointerException if the specified key or value is null
  1932      */
  1933     public V replace(K key, V value) {
  1934         if (value == null)
  1935             throw new NullPointerException();
  1936         Comparable<? super K> k = comparable(key);
  1937         for (;;) {
  1938             Node<K,V> n = findNode(k);
  1939             if (n == null)
  1940                 return null;
  1941             Object v = n.value;
  1942             if (v != null && n.casValue(v, value))
  1943                 return (V)v;
  1944         }
  1945     }
  1946 
  1947     /* ------ SortedMap API methods ------ */
  1948 
  1949     public Comparator<? super K> comparator() {
  1950         return comparator;
  1951     }
  1952 
  1953     /**
  1954      * @throws NoSuchElementException {@inheritDoc}
  1955      */
  1956     public K firstKey() {
  1957         Node<K,V> n = findFirst();
  1958         if (n == null)
  1959             throw new NoSuchElementException();
  1960         return n.key;
  1961     }
  1962 
  1963     /**
  1964      * @throws NoSuchElementException {@inheritDoc}
  1965      */
  1966     public K lastKey() {
  1967         Node<K,V> n = findLast();
  1968         if (n == null)
  1969             throw new NoSuchElementException();
  1970         return n.key;
  1971     }
  1972 
  1973     /**
  1974      * @throws ClassCastException {@inheritDoc}
  1975      * @throws NullPointerException if {@code fromKey} or {@code toKey} is null
  1976      * @throws IllegalArgumentException {@inheritDoc}
  1977      */
  1978     public ConcurrentNavigableMap<K,V> subMap(K fromKey,
  1979                                               boolean fromInclusive,
  1980                                               K toKey,
  1981                                               boolean toInclusive) {
  1982         if (fromKey == null || toKey == null)
  1983             throw new NullPointerException();
  1984         return new SubMap<K,V>
  1985             (this, fromKey, fromInclusive, toKey, toInclusive, false);
  1986     }
  1987 
  1988     /**
  1989      * @throws ClassCastException {@inheritDoc}
  1990      * @throws NullPointerException if {@code toKey} is null
  1991      * @throws IllegalArgumentException {@inheritDoc}
  1992      */
  1993     public ConcurrentNavigableMap<K,V> headMap(K toKey,
  1994                                                boolean inclusive) {
  1995         if (toKey == null)
  1996             throw new NullPointerException();
  1997         return new SubMap<K,V>
  1998             (this, null, false, toKey, inclusive, false);
  1999     }
  2000 
  2001     /**
  2002      * @throws ClassCastException {@inheritDoc}
  2003      * @throws NullPointerException if {@code fromKey} is null
  2004      * @throws IllegalArgumentException {@inheritDoc}
  2005      */
  2006     public ConcurrentNavigableMap<K,V> tailMap(K fromKey,
  2007                                                boolean inclusive) {
  2008         if (fromKey == null)
  2009             throw new NullPointerException();
  2010         return new SubMap<K,V>
  2011             (this, fromKey, inclusive, null, false, false);
  2012     }
  2013 
  2014     /**
  2015      * @throws ClassCastException {@inheritDoc}
  2016      * @throws NullPointerException if {@code fromKey} or {@code toKey} is null
  2017      * @throws IllegalArgumentException {@inheritDoc}
  2018      */
  2019     public ConcurrentNavigableMap<K,V> subMap(K fromKey, K toKey) {
  2020         return subMap(fromKey, true, toKey, false);
  2021     }
  2022 
  2023     /**
  2024      * @throws ClassCastException {@inheritDoc}
  2025      * @throws NullPointerException if {@code toKey} is null
  2026      * @throws IllegalArgumentException {@inheritDoc}
  2027      */
  2028     public ConcurrentNavigableMap<K,V> headMap(K toKey) {
  2029         return headMap(toKey, false);
  2030     }
  2031 
  2032     /**
  2033      * @throws ClassCastException {@inheritDoc}
  2034      * @throws NullPointerException if {@code fromKey} is null
  2035      * @throws IllegalArgumentException {@inheritDoc}
  2036      */
  2037     public ConcurrentNavigableMap<K,V> tailMap(K fromKey) {
  2038         return tailMap(fromKey, true);
  2039     }
  2040 
  2041     /* ---------------- Relational operations -------------- */
  2042 
  2043     /**
  2044      * Returns a key-value mapping associated with the greatest key
  2045      * strictly less than the given key, or <tt>null</tt> if there is
  2046      * no such key. The returned entry does <em>not</em> support the
  2047      * <tt>Entry.setValue</tt> method.
  2048      *
  2049      * @throws ClassCastException {@inheritDoc}
  2050      * @throws NullPointerException if the specified key is null
  2051      */
  2052     public Map.Entry<K,V> lowerEntry(K key) {
  2053         return getNear(key, LT);
  2054     }
  2055 
  2056     /**
  2057      * @throws ClassCastException {@inheritDoc}
  2058      * @throws NullPointerException if the specified key is null
  2059      */
  2060     public K lowerKey(K key) {
  2061         Node<K,V> n = findNear(key, LT);
  2062         return (n == null) ? null : n.key;
  2063     }
  2064 
  2065     /**
  2066      * Returns a key-value mapping associated with the greatest key
  2067      * less than or equal to the given key, or <tt>null</tt> if there
  2068      * is no such key. The returned entry does <em>not</em> support
  2069      * the <tt>Entry.setValue</tt> method.
  2070      *
  2071      * @param key the key
  2072      * @throws ClassCastException {@inheritDoc}
  2073      * @throws NullPointerException if the specified key is null
  2074      */
  2075     public Map.Entry<K,V> floorEntry(K key) {
  2076         return getNear(key, LT|EQ);
  2077     }
  2078 
  2079     /**
  2080      * @param key the key
  2081      * @throws ClassCastException {@inheritDoc}
  2082      * @throws NullPointerException if the specified key is null
  2083      */
  2084     public K floorKey(K key) {
  2085         Node<K,V> n = findNear(key, LT|EQ);
  2086         return (n == null) ? null : n.key;
  2087     }
  2088 
  2089     /**
  2090      * Returns a key-value mapping associated with the least key
  2091      * greater than or equal to the given key, or <tt>null</tt> if
  2092      * there is no such entry. The returned entry does <em>not</em>
  2093      * support the <tt>Entry.setValue</tt> method.
  2094      *
  2095      * @throws ClassCastException {@inheritDoc}
  2096      * @throws NullPointerException if the specified key is null
  2097      */
  2098     public Map.Entry<K,V> ceilingEntry(K key) {
  2099         return getNear(key, GT|EQ);
  2100     }
  2101 
  2102     /**
  2103      * @throws ClassCastException {@inheritDoc}
  2104      * @throws NullPointerException if the specified key is null
  2105      */
  2106     public K ceilingKey(K key) {
  2107         Node<K,V> n = findNear(key, GT|EQ);
  2108         return (n == null) ? null : n.key;
  2109     }
  2110 
  2111     /**
  2112      * Returns a key-value mapping associated with the least key
  2113      * strictly greater than the given key, or <tt>null</tt> if there
  2114      * is no such key. The returned entry does <em>not</em> support
  2115      * the <tt>Entry.setValue</tt> method.
  2116      *
  2117      * @param key the key
  2118      * @throws ClassCastException {@inheritDoc}
  2119      * @throws NullPointerException if the specified key is null
  2120      */
  2121     public Map.Entry<K,V> higherEntry(K key) {
  2122         return getNear(key, GT);
  2123     }
  2124 
  2125     /**
  2126      * @param key the key
  2127      * @throws ClassCastException {@inheritDoc}
  2128      * @throws NullPointerException if the specified key is null
  2129      */
  2130     public K higherKey(K key) {
  2131         Node<K,V> n = findNear(key, GT);
  2132         return (n == null) ? null : n.key;
  2133     }
  2134 
  2135     /**
  2136      * Returns a key-value mapping associated with the least
  2137      * key in this map, or <tt>null</tt> if the map is empty.
  2138      * The returned entry does <em>not</em> support
  2139      * the <tt>Entry.setValue</tt> method.
  2140      */
  2141     public Map.Entry<K,V> firstEntry() {
  2142         for (;;) {
  2143             Node<K,V> n = findFirst();
  2144             if (n == null)
  2145                 return null;
  2146             AbstractMap.SimpleImmutableEntry<K,V> e = n.createSnapshot();
  2147             if (e != null)
  2148                 return e;
  2149         }
  2150     }
  2151 
  2152     /**
  2153      * Returns a key-value mapping associated with the greatest
  2154      * key in this map, or <tt>null</tt> if the map is empty.
  2155      * The returned entry does <em>not</em> support
  2156      * the <tt>Entry.setValue</tt> method.
  2157      */
  2158     public Map.Entry<K,V> lastEntry() {
  2159         for (;;) {
  2160             Node<K,V> n = findLast();
  2161             if (n == null)
  2162                 return null;
  2163             AbstractMap.SimpleImmutableEntry<K,V> e = n.createSnapshot();
  2164             if (e != null)
  2165                 return e;
  2166         }
  2167     }
  2168 
  2169     /**
  2170      * Removes and returns a key-value mapping associated with
  2171      * the least key in this map, or <tt>null</tt> if the map is empty.
  2172      * The returned entry does <em>not</em> support
  2173      * the <tt>Entry.setValue</tt> method.
  2174      */
  2175     public Map.Entry<K,V> pollFirstEntry() {
  2176         return doRemoveFirstEntry();
  2177     }
  2178 
  2179     /**
  2180      * Removes and returns a key-value mapping associated with
  2181      * the greatest key in this map, or <tt>null</tt> if the map is empty.
  2182      * The returned entry does <em>not</em> support
  2183      * the <tt>Entry.setValue</tt> method.
  2184      */
  2185     public Map.Entry<K,V> pollLastEntry() {
  2186         return doRemoveLastEntry();
  2187     }
  2188 
  2189 
  2190     /* ---------------- Iterators -------------- */
  2191 
  2192     /**
  2193      * Base of iterator classes:
  2194      */
  2195     abstract class Iter<T> implements Iterator<T> {
  2196         /** the last node returned by next() */
  2197         Node<K,V> lastReturned;
  2198         /** the next node to return from next(); */
  2199         Node<K,V> next;
  2200         /** Cache of next value field to maintain weak consistency */
  2201         V nextValue;
  2202 
  2203         /** Initializes ascending iterator for entire range. */
  2204         Iter() {
  2205             for (;;) {
  2206                 next = findFirst();
  2207                 if (next == null)
  2208                     break;
  2209                 Object x = next.value;
  2210                 if (x != null && x != next) {
  2211                     nextValue = (V) x;
  2212                     break;
  2213                 }
  2214             }
  2215         }
  2216 
  2217         public final boolean hasNext() {
  2218             return next != null;
  2219         }
  2220 
  2221         /** Advances next to higher entry. */
  2222         final void advance() {
  2223             if (next == null)
  2224                 throw new NoSuchElementException();
  2225             lastReturned = next;
  2226             for (;;) {
  2227                 next = next.next;
  2228                 if (next == null)
  2229                     break;
  2230                 Object x = next.value;
  2231                 if (x != null && x != next) {
  2232                     nextValue = (V) x;
  2233                     break;
  2234                 }
  2235             }
  2236         }
  2237 
  2238         public void remove() {
  2239             Node<K,V> l = lastReturned;
  2240             if (l == null)
  2241                 throw new IllegalStateException();
  2242             // It would not be worth all of the overhead to directly
  2243             // unlink from here. Using remove is fast enough.
  2244             ConcurrentSkipListMap.this.remove(l.key);
  2245             lastReturned = null;
  2246         }
  2247 
  2248     }
  2249 
  2250     final class ValueIterator extends Iter<V> {
  2251         public V next() {
  2252             V v = nextValue;
  2253             advance();
  2254             return v;
  2255         }
  2256     }
  2257 
  2258     final class KeyIterator extends Iter<K> {
  2259         public K next() {
  2260             Node<K,V> n = next;
  2261             advance();
  2262             return n.key;
  2263         }
  2264     }
  2265 
  2266     final class EntryIterator extends Iter<Map.Entry<K,V>> {
  2267         public Map.Entry<K,V> next() {
  2268             Node<K,V> n = next;
  2269             V v = nextValue;
  2270             advance();
  2271             return new AbstractMap.SimpleImmutableEntry<K,V>(n.key, v);
  2272         }
  2273     }
  2274 
  2275     // Factory methods for iterators needed by ConcurrentSkipListSet etc
  2276 
  2277     Iterator<K> keyIterator() {
  2278         return new KeyIterator();
  2279     }
  2280 
  2281     Iterator<V> valueIterator() {
  2282         return new ValueIterator();
  2283     }
  2284 
  2285     Iterator<Map.Entry<K,V>> entryIterator() {
  2286         return new EntryIterator();
  2287     }
  2288 
  2289     /* ---------------- View Classes -------------- */
  2290 
  2291     /*
  2292      * View classes are static, delegating to a ConcurrentNavigableMap
  2293      * to allow use by SubMaps, which outweighs the ugliness of
  2294      * needing type-tests for Iterator methods.
  2295      */
  2296 
  2297     static final <E> List<E> toList(Collection<E> c) {
  2298         // Using size() here would be a pessimization.
  2299         List<E> list = new ArrayList<E>();
  2300         for (E e : c)
  2301             list.add(e);
  2302         return list;
  2303     }
  2304 
  2305     static final class KeySet<E>
  2306             extends AbstractSet<E> implements NavigableSet<E> {
  2307         private final ConcurrentNavigableMap<E,Object> m;
  2308         KeySet(ConcurrentNavigableMap<E,Object> map) { m = map; }
  2309         public int size() { return m.size(); }
  2310         public boolean isEmpty() { return m.isEmpty(); }
  2311         public boolean contains(Object o) { return m.containsKey(o); }
  2312         public boolean remove(Object o) { return m.remove(o) != null; }
  2313         public void clear() { m.clear(); }
  2314         public E lower(E e) { return m.lowerKey(e); }
  2315         public E floor(E e) { return m.floorKey(e); }
  2316         public E ceiling(E e) { return m.ceilingKey(e); }
  2317         public E higher(E e) { return m.higherKey(e); }
  2318         public Comparator<? super E> comparator() { return m.comparator(); }
  2319         public E first() { return m.firstKey(); }
  2320         public E last() { return m.lastKey(); }
  2321         public E pollFirst() {
  2322             Map.Entry<E,Object> e = m.pollFirstEntry();
  2323             return (e == null) ? null : e.getKey();
  2324         }
  2325         public E pollLast() {
  2326             Map.Entry<E,Object> e = m.pollLastEntry();
  2327             return (e == null) ? null : e.getKey();
  2328         }
  2329         public Iterator<E> iterator() {
  2330             if (m instanceof ConcurrentSkipListMap)
  2331                 return ((ConcurrentSkipListMap<E,Object>)m).keyIterator();
  2332             else
  2333                 return ((ConcurrentSkipListMap.SubMap<E,Object>)m).keyIterator();
  2334         }
  2335         public boolean equals(Object o) {
  2336             if (o == this)
  2337                 return true;
  2338             if (!(o instanceof Set))
  2339                 return false;
  2340             Collection<?> c = (Collection<?>) o;
  2341             try {
  2342                 return containsAll(c) && c.containsAll(this);
  2343             } catch (ClassCastException unused)   {
  2344                 return false;
  2345             } catch (NullPointerException unused) {
  2346                 return false;
  2347             }
  2348         }
  2349         public Object[] toArray()     { return toList(this).toArray();  }
  2350         public <T> T[] toArray(T[] a) { return toList(this).toArray(a); }
  2351         public Iterator<E> descendingIterator() {
  2352             return descendingSet().iterator();
  2353         }
  2354         public NavigableSet<E> subSet(E fromElement,
  2355                                       boolean fromInclusive,
  2356                                       E toElement,
  2357                                       boolean toInclusive) {
  2358             return new KeySet<E>(m.subMap(fromElement, fromInclusive,
  2359                                           toElement,   toInclusive));
  2360         }
  2361         public NavigableSet<E> headSet(E toElement, boolean inclusive) {
  2362             return new KeySet<E>(m.headMap(toElement, inclusive));
  2363         }
  2364         public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
  2365             return new KeySet<E>(m.tailMap(fromElement, inclusive));
  2366         }
  2367         public NavigableSet<E> subSet(E fromElement, E toElement) {
  2368             return subSet(fromElement, true, toElement, false);
  2369         }
  2370         public NavigableSet<E> headSet(E toElement) {
  2371             return headSet(toElement, false);
  2372         }
  2373         public NavigableSet<E> tailSet(E fromElement) {
  2374             return tailSet(fromElement, true);
  2375         }
  2376         public NavigableSet<E> descendingSet() {
  2377             return new KeySet(m.descendingMap());
  2378         }
  2379     }
  2380 
  2381     static final class Values<E> extends AbstractCollection<E> {
  2382         private final ConcurrentNavigableMap<Object, E> m;
  2383         Values(ConcurrentNavigableMap<Object, E> map) {
  2384             m = map;
  2385         }
  2386         public Iterator<E> iterator() {
  2387             if (m instanceof ConcurrentSkipListMap)
  2388                 return ((ConcurrentSkipListMap<Object,E>)m).valueIterator();
  2389             else
  2390                 return ((SubMap<Object,E>)m).valueIterator();
  2391         }
  2392         public boolean isEmpty() {
  2393             return m.isEmpty();
  2394         }
  2395         public int size() {
  2396             return m.size();
  2397         }
  2398         public boolean contains(Object o) {
  2399             return m.containsValue(o);
  2400         }
  2401         public void clear() {
  2402             m.clear();
  2403         }
  2404         public Object[] toArray()     { return toList(this).toArray();  }
  2405         public <T> T[] toArray(T[] a) { return toList(this).toArray(a); }
  2406     }
  2407 
  2408     static final class EntrySet<K1,V1> extends AbstractSet<Map.Entry<K1,V1>> {
  2409         private final ConcurrentNavigableMap<K1, V1> m;
  2410         EntrySet(ConcurrentNavigableMap<K1, V1> map) {
  2411             m = map;
  2412         }
  2413 
  2414         public Iterator<Map.Entry<K1,V1>> iterator() {
  2415             if (m instanceof ConcurrentSkipListMap)
  2416                 return ((ConcurrentSkipListMap<K1,V1>)m).entryIterator();
  2417             else
  2418                 return ((SubMap<K1,V1>)m).entryIterator();
  2419         }
  2420 
  2421         public boolean contains(Object o) {
  2422             if (!(o instanceof Map.Entry))
  2423                 return false;
  2424             Map.Entry<K1,V1> e = (Map.Entry<K1,V1>)o;
  2425             V1 v = m.get(e.getKey());
  2426             return v != null && v.equals(e.getValue());
  2427         }
  2428         public boolean remove(Object o) {
  2429             if (!(o instanceof Map.Entry))
  2430                 return false;
  2431             Map.Entry<K1,V1> e = (Map.Entry<K1,V1>)o;
  2432             return m.remove(e.getKey(),
  2433                             e.getValue());
  2434         }
  2435         public boolean isEmpty() {
  2436             return m.isEmpty();
  2437         }
  2438         public int size() {
  2439             return m.size();
  2440         }
  2441         public void clear() {
  2442             m.clear();
  2443         }
  2444         public boolean equals(Object o) {
  2445             if (o == this)
  2446                 return true;
  2447             if (!(o instanceof Set))
  2448                 return false;
  2449             Collection<?> c = (Collection<?>) o;
  2450             try {
  2451                 return containsAll(c) && c.containsAll(this);
  2452             } catch (ClassCastException unused)   {
  2453                 return false;
  2454             } catch (NullPointerException unused) {
  2455                 return false;
  2456             }
  2457         }
  2458         public Object[] toArray()     { return toList(this).toArray();  }
  2459         public <T> T[] toArray(T[] a) { return toList(this).toArray(a); }
  2460     }
  2461 
  2462     /**
  2463      * Submaps returned by {@link ConcurrentSkipListMap} submap operations
  2464      * represent a subrange of mappings of their underlying
  2465      * maps. Instances of this class support all methods of their
  2466      * underlying maps, differing in that mappings outside their range are
  2467      * ignored, and attempts to add mappings outside their ranges result
  2468      * in {@link IllegalArgumentException}.  Instances of this class are
  2469      * constructed only using the <tt>subMap</tt>, <tt>headMap</tt>, and
  2470      * <tt>tailMap</tt> methods of their underlying maps.
  2471      *
  2472      * @serial include
  2473      */
  2474     static final class SubMap<K,V> extends AbstractMap<K,V>
  2475         implements ConcurrentNavigableMap<K,V>, Cloneable,
  2476                    java.io.Serializable {
  2477         private static final long serialVersionUID = -7647078645895051609L;
  2478 
  2479         /** Underlying map */
  2480         private final ConcurrentSkipListMap<K,V> m;
  2481         /** lower bound key, or null if from start */
  2482         private final K lo;
  2483         /** upper bound key, or null if to end */
  2484         private final K hi;
  2485         /** inclusion flag for lo */
  2486         private final boolean loInclusive;
  2487         /** inclusion flag for hi */
  2488         private final boolean hiInclusive;
  2489         /** direction */
  2490         private final boolean isDescending;
  2491 
  2492         // Lazily initialized view holders
  2493         private transient KeySet<K> keySetView;
  2494         private transient Set<Map.Entry<K,V>> entrySetView;
  2495         private transient Collection<V> valuesView;
  2496 
  2497         /**
  2498          * Creates a new submap, initializing all fields
  2499          */
  2500         SubMap(ConcurrentSkipListMap<K,V> map,
  2501                K fromKey, boolean fromInclusive,
  2502                K toKey, boolean toInclusive,
  2503                boolean isDescending) {
  2504             if (fromKey != null && toKey != null &&
  2505                 map.compare(fromKey, toKey) > 0)
  2506                 throw new IllegalArgumentException("inconsistent range");
  2507             this.m = map;
  2508             this.lo = fromKey;
  2509             this.hi = toKey;
  2510             this.loInclusive = fromInclusive;
  2511             this.hiInclusive = toInclusive;
  2512             this.isDescending = isDescending;
  2513         }
  2514 
  2515         /* ----------------  Utilities -------------- */
  2516 
  2517         private boolean tooLow(K key) {
  2518             if (lo != null) {
  2519                 int c = m.compare(key, lo);
  2520                 if (c < 0 || (c == 0 && !loInclusive))
  2521                     return true;
  2522             }
  2523             return false;
  2524         }
  2525 
  2526         private boolean tooHigh(K key) {
  2527             if (hi != null) {
  2528                 int c = m.compare(key, hi);
  2529                 if (c > 0 || (c == 0 && !hiInclusive))
  2530                     return true;
  2531             }
  2532             return false;
  2533         }
  2534 
  2535         private boolean inBounds(K key) {
  2536             return !tooLow(key) && !tooHigh(key);
  2537         }
  2538 
  2539         private void checkKeyBounds(K key) throws IllegalArgumentException {
  2540             if (key == null)
  2541                 throw new NullPointerException();
  2542             if (!inBounds(key))
  2543                 throw new IllegalArgumentException("key out of range");
  2544         }
  2545 
  2546         /**
  2547          * Returns true if node key is less than upper bound of range
  2548          */
  2549         private boolean isBeforeEnd(ConcurrentSkipListMap.Node<K,V> n) {
  2550             if (n == null)
  2551                 return false;
  2552             if (hi == null)
  2553                 return true;
  2554             K k = n.key;
  2555             if (k == null) // pass by markers and headers
  2556                 return true;
  2557             int c = m.compare(k, hi);
  2558             if (c > 0 || (c == 0 && !hiInclusive))
  2559                 return false;
  2560             return true;
  2561         }
  2562 
  2563         /**
  2564          * Returns lowest node. This node might not be in range, so
  2565          * most usages need to check bounds
  2566          */
  2567         private ConcurrentSkipListMap.Node<K,V> loNode() {
  2568             if (lo == null)
  2569                 return m.findFirst();
  2570             else if (loInclusive)
  2571                 return m.findNear(lo, m.GT|m.EQ);
  2572             else
  2573                 return m.findNear(lo, m.GT);
  2574         }
  2575 
  2576         /**
  2577          * Returns highest node. This node might not be in range, so
  2578          * most usages need to check bounds
  2579          */
  2580         private ConcurrentSkipListMap.Node<K,V> hiNode() {
  2581             if (hi == null)
  2582                 return m.findLast();
  2583             else if (hiInclusive)
  2584                 return m.findNear(hi, m.LT|m.EQ);
  2585             else
  2586                 return m.findNear(hi, m.LT);
  2587         }
  2588 
  2589         /**
  2590          * Returns lowest absolute key (ignoring directonality)
  2591          */
  2592         private K lowestKey() {
  2593             ConcurrentSkipListMap.Node<K,V> n = loNode();
  2594             if (isBeforeEnd(n))
  2595                 return n.key;
  2596             else
  2597                 throw new NoSuchElementException();
  2598         }
  2599 
  2600         /**
  2601          * Returns highest absolute key (ignoring directonality)
  2602          */
  2603         private K highestKey() {
  2604             ConcurrentSkipListMap.Node<K,V> n = hiNode();
  2605             if (n != null) {
  2606                 K last = n.key;
  2607                 if (inBounds(last))
  2608                     return last;
  2609             }
  2610             throw new NoSuchElementException();
  2611         }
  2612 
  2613         private Map.Entry<K,V> lowestEntry() {
  2614             for (;;) {
  2615                 ConcurrentSkipListMap.Node<K,V> n = loNode();
  2616                 if (!isBeforeEnd(n))
  2617                     return null;
  2618                 Map.Entry<K,V> e = n.createSnapshot();
  2619                 if (e != null)
  2620                     return e;
  2621             }
  2622         }
  2623 
  2624         private Map.Entry<K,V> highestEntry() {
  2625             for (;;) {
  2626                 ConcurrentSkipListMap.Node<K,V> n = hiNode();
  2627                 if (n == null || !inBounds(n.key))
  2628                     return null;
  2629                 Map.Entry<K,V> e = n.createSnapshot();
  2630                 if (e != null)
  2631                     return e;
  2632             }
  2633         }
  2634 
  2635         private Map.Entry<K,V> removeLowest() {
  2636             for (;;) {
  2637                 Node<K,V> n = loNode();
  2638                 if (n == null)
  2639                     return null;
  2640                 K k = n.key;
  2641                 if (!inBounds(k))
  2642                     return null;
  2643                 V v = m.doRemove(k, null);
  2644                 if (v != null)
  2645                     return new AbstractMap.SimpleImmutableEntry<K,V>(k, v);
  2646             }
  2647         }
  2648 
  2649         private Map.Entry<K,V> removeHighest() {
  2650             for (;;) {
  2651                 Node<K,V> n = hiNode();
  2652                 if (n == null)
  2653                     return null;
  2654                 K k = n.key;
  2655                 if (!inBounds(k))
  2656                     return null;
  2657                 V v = m.doRemove(k, null);
  2658                 if (v != null)
  2659                     return new AbstractMap.SimpleImmutableEntry<K,V>(k, v);
  2660             }
  2661         }
  2662 
  2663         /**
  2664          * Submap version of ConcurrentSkipListMap.getNearEntry
  2665          */
  2666         private Map.Entry<K,V> getNearEntry(K key, int rel) {
  2667             if (isDescending) { // adjust relation for direction
  2668                 if ((rel & m.LT) == 0)
  2669                     rel |= m.LT;
  2670                 else
  2671                     rel &= ~m.LT;
  2672             }
  2673             if (tooLow(key))
  2674                 return ((rel & m.LT) != 0) ? null : lowestEntry();
  2675             if (tooHigh(key))
  2676                 return ((rel & m.LT) != 0) ? highestEntry() : null;
  2677             for (;;) {
  2678                 Node<K,V> n = m.findNear(key, rel);
  2679                 if (n == null || !inBounds(n.key))
  2680                     return null;
  2681                 K k = n.key;
  2682                 V v = n.getValidValue();
  2683                 if (v != null)
  2684                     return new AbstractMap.SimpleImmutableEntry<K,V>(k, v);
  2685             }
  2686         }
  2687 
  2688         // Almost the same as getNearEntry, except for keys
  2689         private K getNearKey(K key, int rel) {
  2690             if (isDescending) { // adjust relation for direction
  2691                 if ((rel & m.LT) == 0)
  2692                     rel |= m.LT;
  2693                 else
  2694                     rel &= ~m.LT;
  2695             }
  2696             if (tooLow(key)) {
  2697                 if ((rel & m.LT) == 0) {
  2698                     ConcurrentSkipListMap.Node<K,V> n = loNode();
  2699                     if (isBeforeEnd(n))
  2700                         return n.key;
  2701                 }
  2702                 return null;
  2703             }
  2704             if (tooHigh(key)) {
  2705                 if ((rel & m.LT) != 0) {
  2706                     ConcurrentSkipListMap.Node<K,V> n = hiNode();
  2707                     if (n != null) {
  2708                         K last = n.key;
  2709                         if (inBounds(last))
  2710                             return last;
  2711                     }
  2712                 }
  2713                 return null;
  2714             }
  2715             for (;;) {
  2716                 Node<K,V> n = m.findNear(key, rel);
  2717                 if (n == null || !inBounds(n.key))
  2718                     return null;
  2719                 K k = n.key;
  2720                 V v = n.getValidValue();
  2721                 if (v != null)
  2722                     return k;
  2723             }
  2724         }
  2725 
  2726         /* ----------------  Map API methods -------------- */
  2727 
  2728         public boolean containsKey(Object key) {
  2729             if (key == null) throw new NullPointerException();
  2730             K k = (K)key;
  2731             return inBounds(k) && m.containsKey(k);
  2732         }
  2733 
  2734         public V get(Object key) {
  2735             if (key == null) throw new NullPointerException();
  2736             K k = (K)key;
  2737             return ((!inBounds(k)) ? null : m.get(k));
  2738         }
  2739 
  2740         public V put(K key, V value) {
  2741             checkKeyBounds(key);
  2742             return m.put(key, value);
  2743         }
  2744 
  2745         public V remove(Object key) {
  2746             K k = (K)key;
  2747             return (!inBounds(k)) ? null : m.remove(k);
  2748         }
  2749 
  2750         public int size() {
  2751             long count = 0;
  2752             for (ConcurrentSkipListMap.Node<K,V> n = loNode();
  2753                  isBeforeEnd(n);
  2754                  n = n.next) {
  2755                 if (n.getValidValue() != null)
  2756                     ++count;
  2757             }
  2758             return count >= Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)count;
  2759         }
  2760 
  2761         public boolean isEmpty() {
  2762             return !isBeforeEnd(loNode());
  2763         }
  2764 
  2765         public boolean containsValue(Object value) {
  2766             if (value == null)
  2767                 throw new NullPointerException();
  2768             for (ConcurrentSkipListMap.Node<K,V> n = loNode();
  2769                  isBeforeEnd(n);
  2770                  n = n.next) {
  2771                 V v = n.getValidValue();
  2772                 if (v != null && value.equals(v))
  2773                     return true;
  2774             }
  2775             return false;
  2776         }
  2777 
  2778         public void clear() {
  2779             for (ConcurrentSkipListMap.Node<K,V> n = loNode();
  2780                  isBeforeEnd(n);
  2781                  n = n.next) {
  2782                 if (n.getValidValue() != null)
  2783                     m.remove(n.key);
  2784             }
  2785         }
  2786 
  2787         /* ----------------  ConcurrentMap API methods -------------- */
  2788 
  2789         public V putIfAbsent(K key, V value) {
  2790             checkKeyBounds(key);
  2791             return m.putIfAbsent(key, value);
  2792         }
  2793 
  2794         public boolean remove(Object key, Object value) {
  2795             K k = (K)key;
  2796             return inBounds(k) && m.remove(k, value);
  2797         }
  2798 
  2799         public boolean replace(K key, V oldValue, V newValue) {
  2800             checkKeyBounds(key);
  2801             return m.replace(key, oldValue, newValue);
  2802         }
  2803 
  2804         public V replace(K key, V value) {
  2805             checkKeyBounds(key);
  2806             return m.replace(key, value);
  2807         }
  2808 
  2809         /* ----------------  SortedMap API methods -------------- */
  2810 
  2811         public Comparator<? super K> comparator() {
  2812             Comparator<? super K> cmp = m.comparator();
  2813             if (isDescending)
  2814                 return Collections.reverseOrder(cmp);
  2815             else
  2816                 return cmp;
  2817         }
  2818 
  2819         /**
  2820          * Utility to create submaps, where given bounds override
  2821          * unbounded(null) ones and/or are checked against bounded ones.
  2822          */
  2823         private SubMap<K,V> newSubMap(K fromKey,
  2824                                       boolean fromInclusive,
  2825                                       K toKey,
  2826                                       boolean toInclusive) {
  2827             if (isDescending) { // flip senses
  2828                 K tk = fromKey;
  2829                 fromKey = toKey;
  2830                 toKey = tk;
  2831                 boolean ti = fromInclusive;
  2832                 fromInclusive = toInclusive;
  2833                 toInclusive = ti;
  2834             }
  2835             if (lo != null) {
  2836                 if (fromKey == null) {
  2837                     fromKey = lo;
  2838                     fromInclusive = loInclusive;
  2839                 }
  2840                 else {
  2841                     int c = m.compare(fromKey, lo);
  2842                     if (c < 0 || (c == 0 && !loInclusive && fromInclusive))
  2843                         throw new IllegalArgumentException("key out of range");
  2844                 }
  2845             }
  2846             if (hi != null) {
  2847                 if (toKey == null) {
  2848                     toKey = hi;
  2849                     toInclusive = hiInclusive;
  2850                 }
  2851                 else {
  2852                     int c = m.compare(toKey, hi);
  2853                     if (c > 0 || (c == 0 && !hiInclusive && toInclusive))
  2854                         throw new IllegalArgumentException("key out of range");
  2855                 }
  2856             }
  2857             return new SubMap<K,V>(m, fromKey, fromInclusive,
  2858                                    toKey, toInclusive, isDescending);
  2859         }
  2860 
  2861         public SubMap<K,V> subMap(K fromKey,
  2862                                   boolean fromInclusive,
  2863                                   K toKey,
  2864                                   boolean toInclusive) {
  2865             if (fromKey == null || toKey == null)
  2866                 throw new NullPointerException();
  2867             return newSubMap(fromKey, fromInclusive, toKey, toInclusive);
  2868         }
  2869 
  2870         public SubMap<K,V> headMap(K toKey,
  2871                                    boolean inclusive) {
  2872             if (toKey == null)
  2873                 throw new NullPointerException();
  2874             return newSubMap(null, false, toKey, inclusive);
  2875         }
  2876 
  2877         public SubMap<K,V> tailMap(K fromKey,
  2878                                    boolean inclusive) {
  2879             if (fromKey == null)
  2880                 throw new NullPointerException();
  2881             return newSubMap(fromKey, inclusive, null, false);
  2882         }
  2883 
  2884         public SubMap<K,V> subMap(K fromKey, K toKey) {
  2885             return subMap(fromKey, true, toKey, false);
  2886         }
  2887 
  2888         public SubMap<K,V> headMap(K toKey) {
  2889             return headMap(toKey, false);
  2890         }
  2891 
  2892         public SubMap<K,V> tailMap(K fromKey) {
  2893             return tailMap(fromKey, true);
  2894         }
  2895 
  2896         public SubMap<K,V> descendingMap() {
  2897             return new SubMap<K,V>(m, lo, loInclusive,
  2898                                    hi, hiInclusive, !isDescending);
  2899         }
  2900 
  2901         /* ----------------  Relational methods -------------- */
  2902 
  2903         public Map.Entry<K,V> ceilingEntry(K key) {
  2904             return getNearEntry(key, (m.GT|m.EQ));
  2905         }
  2906 
  2907         public K ceilingKey(K key) {
  2908             return getNearKey(key, (m.GT|m.EQ));
  2909         }
  2910 
  2911         public Map.Entry<K,V> lowerEntry(K key) {
  2912             return getNearEntry(key, (m.LT));
  2913         }
  2914 
  2915         public K lowerKey(K key) {
  2916             return getNearKey(key, (m.LT));
  2917         }
  2918 
  2919         public Map.Entry<K,V> floorEntry(K key) {
  2920             return getNearEntry(key, (m.LT|m.EQ));
  2921         }
  2922 
  2923         public K floorKey(K key) {
  2924             return getNearKey(key, (m.LT|m.EQ));
  2925         }
  2926 
  2927         public Map.Entry<K,V> higherEntry(K key) {
  2928             return getNearEntry(key, (m.GT));
  2929         }
  2930 
  2931         public K higherKey(K key) {
  2932             return getNearKey(key, (m.GT));
  2933         }
  2934 
  2935         public K firstKey() {
  2936             return isDescending ? highestKey() : lowestKey();
  2937         }
  2938 
  2939         public K lastKey() {
  2940             return isDescending ? lowestKey() : highestKey();
  2941         }
  2942 
  2943         public Map.Entry<K,V> firstEntry() {
  2944             return isDescending ? highestEntry() : lowestEntry();
  2945         }
  2946 
  2947         public Map.Entry<K,V> lastEntry() {
  2948             return isDescending ? lowestEntry() : highestEntry();
  2949         }
  2950 
  2951         public Map.Entry<K,V> pollFirstEntry() {
  2952             return isDescending ? removeHighest() : removeLowest();
  2953         }
  2954 
  2955         public Map.Entry<K,V> pollLastEntry() {
  2956             return isDescending ? removeLowest() : removeHighest();
  2957         }
  2958 
  2959         /* ---------------- Submap Views -------------- */
  2960 
  2961         public NavigableSet<K> keySet() {
  2962             KeySet<K> ks = keySetView;
  2963             return (ks != null) ? ks : (keySetView = new KeySet(this));
  2964         }
  2965 
  2966         public NavigableSet<K> navigableKeySet() {
  2967             KeySet<K> ks = keySetView;
  2968             return (ks != null) ? ks : (keySetView = new KeySet(this));
  2969         }
  2970 
  2971         public Collection<V> values() {
  2972             Collection<V> vs = valuesView;
  2973             return (vs != null) ? vs : (valuesView = new Values(this));
  2974         }
  2975 
  2976         public Set<Map.Entry<K,V>> entrySet() {
  2977             Set<Map.Entry<K,V>> es = entrySetView;
  2978             return (es != null) ? es : (entrySetView = new EntrySet(this));
  2979         }
  2980 
  2981         public NavigableSet<K> descendingKeySet() {
  2982             return descendingMap().navigableKeySet();
  2983         }
  2984 
  2985         Iterator<K> keyIterator() {
  2986             return new SubMapKeyIterator();
  2987         }
  2988 
  2989         Iterator<V> valueIterator() {
  2990             return new SubMapValueIterator();
  2991         }
  2992 
  2993         Iterator<Map.Entry<K,V>> entryIterator() {
  2994             return new SubMapEntryIterator();
  2995         }
  2996 
  2997         /**
  2998          * Variant of main Iter class to traverse through submaps.
  2999          */
  3000         abstract class SubMapIter<T> implements Iterator<T> {
  3001             /** the last node returned by next() */
  3002             Node<K,V> lastReturned;
  3003             /** the next node to return from next(); */
  3004             Node<K,V> next;
  3005             /** Cache of next value field to maintain weak consistency */
  3006             V nextValue;
  3007 
  3008             SubMapIter() {
  3009                 for (;;) {
  3010                     next = isDescending ? hiNode() : loNode();
  3011                     if (next == null)
  3012                         break;
  3013                     Object x = next.value;
  3014                     if (x != null && x != next) {
  3015                         if (! inBounds(next.key))
  3016                             next = null;
  3017                         else
  3018                             nextValue = (V) x;
  3019                         break;
  3020                     }
  3021                 }
  3022             }
  3023 
  3024             public final boolean hasNext() {
  3025                 return next != null;
  3026             }
  3027 
  3028             final void advance() {
  3029                 if (next == null)
  3030                     throw new NoSuchElementException();
  3031                 lastReturned = next;
  3032                 if (isDescending)
  3033                     descend();
  3034                 else
  3035                     ascend();
  3036             }
  3037 
  3038             private void ascend() {
  3039                 for (;;) {
  3040                     next = next.next;
  3041                     if (next == null)
  3042                         break;
  3043                     Object x = next.value;
  3044                     if (x != null && x != next) {
  3045                         if (tooHigh(next.key))
  3046                             next = null;
  3047                         else
  3048                             nextValue = (V) x;
  3049                         break;
  3050                     }
  3051                 }
  3052             }
  3053 
  3054             private void descend() {
  3055                 for (;;) {
  3056                     next = m.findNear(lastReturned.key, LT);
  3057                     if (next == null)
  3058                         break;
  3059                     Object x = next.value;
  3060                     if (x != null && x != next) {
  3061                         if (tooLow(next.key))
  3062                             next = null;
  3063                         else
  3064                             nextValue = (V) x;
  3065                         break;
  3066                     }
  3067                 }
  3068             }
  3069 
  3070             public void remove() {
  3071                 Node<K,V> l = lastReturned;
  3072                 if (l == null)
  3073                     throw new IllegalStateException();
  3074                 m.remove(l.key);
  3075                 lastReturned = null;
  3076             }
  3077 
  3078         }
  3079 
  3080         final class SubMapValueIterator extends SubMapIter<V> {
  3081             public V next() {
  3082                 V v = nextValue;
  3083                 advance();
  3084                 return v;
  3085             }
  3086         }
  3087 
  3088         final class SubMapKeyIterator extends SubMapIter<K> {
  3089             public K next() {
  3090                 Node<K,V> n = next;
  3091                 advance();
  3092                 return n.key;
  3093             }
  3094         }
  3095 
  3096         final class SubMapEntryIterator extends SubMapIter<Map.Entry<K,V>> {
  3097             public Map.Entry<K,V> next() {
  3098                 Node<K,V> n = next;
  3099                 V v = nextValue;
  3100                 advance();
  3101                 return new AbstractMap.SimpleImmutableEntry<K,V>(n.key, v);
  3102             }
  3103         }
  3104     }
  3105 
  3106     // Unsafe mechanics
  3107     private static final sun.misc.Unsafe UNSAFE;
  3108     private static final long headOffset;
  3109     static {
  3110         try {
  3111             UNSAFE = sun.misc.Unsafe.getUnsafe();
  3112             Class k = ConcurrentSkipListMap.class;
  3113             headOffset = UNSAFE.objectFieldOffset
  3114                 (k.getDeclaredField("head"));
  3115         } catch (Exception e) {
  3116             throw new Error(e);
  3117         }
  3118     }
  3119 }