ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166x/ConcurrentSkipListSet.java
(Generate patch)

Comparing jsr166/src/jsr166x/ConcurrentSkipListSet.java (file contents):
Revision 1.16 by jsr166, Sun Dec 30 00:05:22 2012 UTC vs.
Revision 1.17 by jsr166, Wed Jan 16 00:51:11 2013 UTC

# Line 18 | Line 18 | import java.util.concurrent.*;
18   * used.
19   *
20   * <p>This implementation provides expected average <i>log(n)</i> time
21 < * cost for the <tt>contains</tt>, <tt>add</tt>, and <tt>remove</tt>
21 > * cost for the {@code contains}, {@code add}, and {@code remove}
22   * operations and their variants.  Insertion, removal, and access
23   * operations safely execute concurrently by multiple
24   * threads. Iterators are <i>weakly consistent</i>, returning elements
# Line 27 | Line 27 | import java.util.concurrent.*;
27   * ConcurrentModificationException}, and may proceed concurrently with
28   * other operations.
29   *
30 < * <p>Beware that, unlike in most collections, the <tt>size</tt>
30 > * <p>Beware that, unlike in most collections, the {@code size}
31   * method is <em>not</em> a constant-time operation. Because of the
32   * asynchronous nature of these sets, determining the current number
33   * of elements requires a traversal of the elements. Additionally, the
34 < * bulk operations <tt>addAll</tt>, <tt>removeAll</tt>,
35 < * <<tt>retainAll</tt>, and tt>containsAll</tt> are <em>not</em>
34 > * bulk operations {@code addAll}, {@code removeAll},
35 > * <{@code retainAll}, and tt>containsAll</tt> are <em>not</em>
36   * guaranteed to be performed atomically. For example, an iterator
37 < * operating concurrently with an <tt>addAll</tt> operation might view
37 > * operating concurrently with an {@code addAll} operation might view
38   * only some of the added elements.
39   *
40   * <p>This class and its iterators implement all of the
41   * <em>optional</em> methods of the {@link Set} and {@link Iterator}
42   * interfaces. Like most other concurrent collection implementations,
43 < * this class does not permit the use of <tt>null</tt> elements.
44 < * because <tt>null</tt> arguments and return values cannot be reliably
43 > * this class does not permit the use of {@code null} elements.
44 > * because {@code null} arguments and return values cannot be reliably
45   * distinguished from the absence of elements.
46   *
47   * @author Doug Lea
# Line 75 | Line 75 | public class ConcurrentSkipListSet<E>
75       * comparator.
76       *
77       * @param c the comparator that will be used to sort this set.  A
78 <     *        <tt>null</tt> value indicates that the elements' <i>natural
78 >     *        {@code null} value indicates that the elements' <i>natural
79       *        ordering</i> should be used.
80       */
81      public ConcurrentSkipListSet(Comparator<? super E> c) {
# Line 91 | Line 91 | public class ConcurrentSkipListSet<E>
91       * @throws ClassCastException if the elements in the specified
92       * collection are not comparable, or are not mutually comparable
93       * @throws NullPointerException if the specified collection is
94 <     * <tt>null</tt>
94 >     * {@code null}
95       */
96      public ConcurrentSkipListSet(Collection<? extends E> c) {
97          m = new ConcurrentSkipListMap<E,Object>();
# Line 104 | Line 104 | public class ConcurrentSkipListSet<E>
104       *
105       * @param s sorted set whose elements will comprise the new set
106       * @throws NullPointerException if the specified sorted set is
107 <     * <tt>null</tt>
107 >     * {@code null}
108       */
109      public ConcurrentSkipListSet(SortedSet<E> s) {
110          m = new ConcurrentSkipListMap<E,Object>(s.comparator());
# Line 134 | Line 134 | public class ConcurrentSkipListSet<E>
134  
135      /**
136       * Returns the number of elements in this set.  If this set
137 <     * contains more than <tt>Integer.MAX_VALUE</tt> elements, it
138 <     * returns <tt>Integer.MAX_VALUE</tt>.
137 >     * contains more than {@code Integer.MAX_VALUE} elements, it
138 >     * returns {@code Integer.MAX_VALUE}.
139       *
140       * <p>Beware that, unlike in most collections, this method is
141       * <em>NOT</em> a constant-time operation. Because of the
# Line 153 | Line 153 | public class ConcurrentSkipListSet<E>
153      }
154  
155      /**
156 <     * Returns <tt>true</tt> if this set contains no elements.
157 <     * @return <tt>true</tt> if this set contains no elements
156 >     * Returns {@code true} if this set contains no elements.
157 >     * @return {@code true} if this set contains no elements
158       */
159      public boolean isEmpty() {
160          return m.isEmpty();
161      }
162  
163      /**
164 <     * Returns <tt>true</tt> if this set contains the specified element.
164 >     * Returns {@code true} if this set contains the specified element.
165       *
166       * @param o the object to be checked for containment in this set
167 <     * @return <tt>true</tt> if this set contains the specified element
167 >     * @return {@code true} if this set contains the specified element
168       *
169       * @throws ClassCastException if the specified object cannot be compared
170       *            with the elements currently in the set
171 <     * @throws NullPointerException if o is <tt>null</tt>
171 >     * @throws NullPointerException if o is {@code null}
172       */
173      public boolean contains(Object o) {
174          return m.containsKey(o);
# Line 178 | Line 178 | public class ConcurrentSkipListSet<E>
178       * Adds the specified element to this set if it is not already present.
179       *
180       * @param o element to be added to this set
181 <     * @return <tt>true</tt> if the set did not already contain the specified
181 >     * @return {@code true} if the set did not already contain the specified
182       *         element
183       *
184       * @throws ClassCastException if the specified object cannot be compared
185       *            with the elements currently in the set
186 <     * @throws NullPointerException if o is <tt>null</tt>
186 >     * @throws NullPointerException if o is {@code null}
187       */
188      public boolean add(E o) {
189          return m.putIfAbsent(o, Boolean.TRUE) == null;
# Line 193 | Line 193 | public class ConcurrentSkipListSet<E>
193       * Removes the specified element from this set if it is present.
194       *
195       * @param o object to be removed from this set, if present
196 <     * @return <tt>true</tt> if the set contained the specified element
196 >     * @return {@code true} if the set contained the specified element
197       *
198       * @throws ClassCastException if the specified object cannot be compared
199       *            with the elements currently in the set
200 <     * @throws NullPointerException if o is <tt>null</tt>
200 >     * @throws NullPointerException if o is {@code null}
201       */
202      public boolean remove(Object o) {
203          return m.removep(o);
# Line 234 | Line 234 | public class ConcurrentSkipListSet<E>
234  
235      /**
236       * Compares the specified object with this set for equality.  Returns
237 <     * <tt>true</tt> if the specified object is also a set, the two sets
237 >     * {@code true} if the specified object is also a set, the two sets
238       * have the same size, and every member of the specified set is
239       * contained in this set (or equivalently, every member of this set is
240       * contained in the specified set).  This definition ensures that the
# Line 242 | Line 242 | public class ConcurrentSkipListSet<E>
242       * set interface.
243       *
244       * @param o Object to be compared for equality with this set
245 <     * @return <tt>true</tt> if the specified Object is equal to this set
245 >     * @return {@code true} if the specified Object is equal to this set
246       */
247      public boolean equals(Object o) {
248          // Override AbstractSet version to avoid calling size()
# Line 268 | Line 268 | public class ConcurrentSkipListSet<E>
268       *
269       * @param  c collection that defines which elements will be removed from
270       *           this set
271 <     * @return <tt>true</tt> if this set changed as a result of the call
271 >     * @return {@code true} if this set changed as a result of the call
272       *
273       * @throws ClassCastException if the types of one or more elements in this
274       *            set are incompatible with the specified collection
275       * @throws NullPointerException if the specified collection, or any
276 <     * of its elements are <tt>null</tt>
276 >     * of its elements are {@code null}
277       */
278      public boolean removeAll(Collection<?> c) {
279          // Override AbstractSet version to avoid unnecessary call to size()
# Line 288 | Line 288 | public class ConcurrentSkipListSet<E>
288  
289      /**
290       * Returns an element greater than or equal to the given element, or
291 <     * <tt>null</tt> if there is no such element.
291 >     * {@code null} if there is no such element.
292       *
293       * @param o the value to match
294       * @return an element greater than or equal to given element, or
295 <     * <tt>null</tt> if there is no such element
295 >     * {@code null} if there is no such element
296       * @throws ClassCastException if o cannot be compared with the elements
297       *            currently in the set
298 <     * @throws NullPointerException if o is <tt>null</tt>
298 >     * @throws NullPointerException if o is {@code null}
299       */
300      public E ceiling(E o) {
301          return m.ceilingKey(o);
# Line 303 | Line 303 | public class ConcurrentSkipListSet<E>
303  
304      /**
305       * Returns an element strictly less than the given element, or
306 <     * <tt>null</tt> if there is no such element.
306 >     * {@code null} if there is no such element.
307       *
308       * @param o the value to match
309       * @return the greatest element less than the given element, or
310 <     * <tt>null</tt> if there is no such element
310 >     * {@code null} if there is no such element
311       * @throws ClassCastException if o cannot be compared with the elements
312       *            currently in the set
313 <     * @throws NullPointerException if o is <tt>null</tt>
313 >     * @throws NullPointerException if o is {@code null}
314       */
315      public E lower(E o) {
316          return m.lowerKey(o);
# Line 318 | Line 318 | public class ConcurrentSkipListSet<E>
318  
319      /**
320       * Returns an element less than or equal to the given element, or
321 <     * <tt>null</tt> if there is no such element.
321 >     * {@code null} if there is no such element.
322       *
323       * @param o the value to match
324       * @return the greatest element less than or equal to given
325 <     * element, or <tt>null</tt> if there is no such element
325 >     * element, or {@code null} if there is no such element
326       * @throws ClassCastException if o cannot be compared with the elements
327       *            currently in the set
328 <     * @throws NullPointerException if o is <tt>null</tt>
328 >     * @throws NullPointerException if o is {@code null}
329       */
330      public E floor(E o) {
331          return m.floorKey(o);
# Line 333 | Line 333 | public class ConcurrentSkipListSet<E>
333  
334      /**
335       * Returns an element strictly greater than the given element, or
336 <     * <tt>null</tt> if there is no such element.
336 >     * {@code null} if there is no such element.
337       *
338       * @param o the value to match
339       * @return the least element greater than the given element, or
340 <     * <tt>null</tt> if there is no such element
340 >     * {@code null} if there is no such element
341       * @throws ClassCastException if o cannot be compared with the elements
342       *            currently in the set
343 <     * @throws NullPointerException if o is <tt>null</tt>
343 >     * @throws NullPointerException if o is {@code null}
344       */
345      public E higher(E o) {
346          return m.higherKey(o);
# Line 349 | Line 349 | public class ConcurrentSkipListSet<E>
349      /**
350       * Retrieves and removes the first (lowest) element.
351       *
352 <     * @return the least element, or <tt>null</tt> if empty
352 >     * @return the least element, or {@code null} if empty
353       */
354      public E pollFirst() {
355          return m.pollFirstKey();
# Line 358 | Line 358 | public class ConcurrentSkipListSet<E>
358      /**
359       * Retrieves and removes the last (highest) element.
360       *
361 <     * @return the last element, or <tt>null</tt> if empty
361 >     * @return the last element, or {@code null} if empty
362       */
363      public E pollLast() {
364          return m.pollLastKey();
# Line 369 | Line 369 | public class ConcurrentSkipListSet<E>
369  
370  
371      /**
372 <     * Returns the comparator used to order this set, or <tt>null</tt>
372 >     * Returns the comparator used to order this set, or {@code null}
373       * if this set uses its elements natural ordering.
374       *
375 <     * @return the comparator used to order this set, or <tt>null</tt>
375 >     * @return the comparator used to order this set, or {@code null}
376       * if this set uses its elements natural ordering
377       */
378      public Comparator<? super E> comparator() {
# Line 403 | Line 403 | public class ConcurrentSkipListSet<E>
403  
404      /**
405       * Returns a view of the portion of this set whose elements range from
406 <     * <tt>fromElement</tt>, inclusive, to <tt>toElement</tt>, exclusive.  (If
407 <     * <tt>fromElement</tt> and <tt>toElement</tt> are equal, the returned
406 >     * {@code fromElement}, inclusive, to {@code toElement}, exclusive.  (If
407 >     * {@code fromElement} and {@code toElement} are equal, the returned
408       * sorted set is empty.)  The returned sorted set is backed by this set,
409       * so changes in the returned sorted set are reflected in this set, and
410       * vice-versa.
411       * @param fromElement low endpoint (inclusive) of the subSet
412       * @param toElement high endpoint (exclusive) of the subSet
413       * @return a view of the portion of this set whose elements range from
414 <     *         <tt>fromElement</tt>, inclusive, to <tt>toElement</tt>,
414 >     *         {@code fromElement}, inclusive, to {@code toElement},
415       *         exclusive
416 <     * @throws ClassCastException if <tt>fromElement</tt> and
417 <     *         <tt>toElement</tt> cannot be compared to one another using
416 >     * @throws ClassCastException if {@code fromElement} and
417 >     *         {@code toElement} cannot be compared to one another using
418       *         this set's comparator (or, if the set has no comparator,
419       *         using natural ordering)
420 <     * @throws IllegalArgumentException if <tt>fromElement</tt> is
421 <     * greater than <tt>toElement</tt>
422 <     * @throws NullPointerException if <tt>fromElement</tt> or
423 <     *         <tt>toElement</tt> is <tt>null</tt>
420 >     * @throws IllegalArgumentException if {@code fromElement} is
421 >     * greater than {@code toElement}
422 >     * @throws NullPointerException if {@code fromElement} or
423 >     *         {@code toElement} is {@code null}
424       */
425      public NavigableSet<E> subSet(E fromElement, E toElement) {
426          return new ConcurrentSkipListSubSet<E>(m, fromElement, toElement);
# Line 428 | Line 428 | public class ConcurrentSkipListSet<E>
428  
429      /**
430       * Returns a view of the portion of this set whose elements are strictly
431 <     * less than <tt>toElement</tt>.  The returned sorted set is backed by
431 >     * less than {@code toElement}.  The returned sorted set is backed by
432       * this set, so changes in the returned sorted set are reflected in this
433       * set, and vice-versa.
434       * @param toElement high endpoint (exclusive) of the headSet
435       * @return a view of the portion of this set whose elements are strictly
436       *         less than toElement
437 <     * @throws ClassCastException if <tt>toElement</tt> is not compatible
437 >     * @throws ClassCastException if {@code toElement} is not compatible
438       *         with this set's comparator (or, if the set has no comparator,
439 <     *         if <tt>toElement</tt> does not implement <tt>Comparable</tt>)
440 <     * @throws NullPointerException if <tt>toElement</tt> is <tt>null</tt>
439 >     *         if {@code toElement} does not implement {@code Comparable})
440 >     * @throws NullPointerException if {@code toElement} is {@code null}
441       */
442      public NavigableSet<E> headSet(E toElement) {
443          return new ConcurrentSkipListSubSet<E>(m, null, toElement);
# Line 446 | Line 446 | public class ConcurrentSkipListSet<E>
446  
447      /**
448       * Returns a view of the portion of this set whose elements are
449 <     * greater than or equal to <tt>fromElement</tt>.  The returned
449 >     * greater than or equal to {@code fromElement}.  The returned
450       * sorted set is backed by this set, so changes in the returned
451       * sorted set are reflected in this set, and vice-versa.
452       * @param fromElement low endpoint (inclusive) of the tailSet
453       * @return a view of the portion of this set whose elements are
454 <     * greater than or equal to <tt>fromElement</tt>
455 <     * @throws ClassCastException if <tt>fromElement</tt> is not
454 >     * greater than or equal to {@code fromElement}
455 >     * @throws ClassCastException if {@code fromElement} is not
456       * compatible with this set's comparator (or, if the set has no
457 <     * comparator, if <tt>fromElement</tt> does not implement
458 <     * <tt>Comparable</tt>)
459 <     * @throws NullPointerException if <tt>fromElement</tt> is <tt>null</tt>
457 >     * comparator, if {@code fromElement} does not implement
458 >     * {@code Comparable})
459 >     * @throws NullPointerException if {@code fromElement} is {@code null}
460       */
461      public NavigableSet<E> tailSet(E fromElement) {
462          return new ConcurrentSkipListSubSet<E>(m, fromElement, null);
# Line 469 | Line 469 | public class ConcurrentSkipListSet<E>
469       * underlying sets, differing in that elements outside their range are
470       * ignored, and attempts to add elements outside their ranges result
471       * in {@link IllegalArgumentException}.  Instances of this class are
472 <     * constructed only using the <tt>subSet</tt>, <tt>headSet</tt>, and
473 <     * <tt>tailSet</tt> methods of their underlying sets.
472 >     * constructed only using the {@code subSet}, {@code headSet}, and
473 >     * {@code tailSet} methods of their underlying sets.
474       */
475      static class ConcurrentSkipListSubSet<E>
476          extends AbstractSet<E>
# Line 483 | Line 483 | public class ConcurrentSkipListSet<E>
483  
484          /**
485           * Creates a new submap.
486 <         * @param fromElement inclusive least value, or <tt>null</tt> if from start
487 <         * @param toElement exclusive upper bound or <tt>null</tt> if to end
486 >         * @param fromElement inclusive least value, or {@code null} if from start
487 >         * @param toElement exclusive upper bound or {@code null} if to end
488           * @throws IllegalArgumentException if fromElement and toElement
489           * non-null and fromElement greater than toElement
490           */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines