--- jsr166/src/jsr166e/ConcurrentHashMapV8.java 2012/08/13 15:52:33 1.52
+++ jsr166/src/jsr166e/ConcurrentHashMapV8.java 2012/10/21 06:14:11 1.69
@@ -47,19 +47,22 @@ import java.io.Serializable;
* block, so may overlap with update operations (including {@code put}
* and {@code remove}). Retrievals reflect the results of the most
* recently completed update operations holding upon their
- * onset. For aggregate operations such as {@code putAll} and {@code
- * clear}, concurrent retrievals may reflect insertion or removal of
- * only some entries. Similarly, Iterators and Enumerations return
- * elements reflecting the state of the hash table at some point at or
- * since the creation of the iterator/enumeration. They do
- * not throw {@link ConcurrentModificationException}.
- * However, iterators are designed to be used by only one thread at a
- * time. Bear in mind that the results of aggregate status methods
- * including {@code size}, {@code isEmpty}, and {@code containsValue}
- * are typically useful only when a map is not undergoing concurrent
- * updates in other threads. Otherwise the results of these methods
- * reflect transient states that may be adequate for monitoring
- * or estimation purposes, but not for program control.
+ * onset. (More formally, an update operation for a given key bears a
+ * happens-before relation with any (non-null) retrieval for
+ * that key reporting the updated value.) For aggregate operations
+ * such as {@code putAll} and {@code clear}, concurrent retrievals may
+ * reflect insertion or removal of only some entries. Similarly,
+ * Iterators and Enumerations return elements reflecting the state of
+ * the hash table at some point at or since the creation of the
+ * iterator/enumeration. They do not throw {@link
+ * ConcurrentModificationException}. However, iterators are designed
+ * to be used by only one thread at a time. Bear in mind that the
+ * results of aggregate status methods including {@code size}, {@code
+ * isEmpty}, and {@code containsValue} are typically useful only when
+ * a map is not undergoing concurrent updates in other threads.
+ * Otherwise the results of these methods reflect transient states
+ * that may be adequate for monitoring or estimation purposes, but not
+ * for program control.
*
*
The table is dynamically expanded when there are too many
* collisions (i.e., keys that have distinct hash codes but fall into
@@ -537,9 +540,13 @@ public class ConcurrentHashMapV8
* unlocking lock (via a failed CAS from non-waiting LOCKED
* state), unlockers acquire the sync lock and perform a
* notifyAll.
+ *
+ * The initial sanity check on tab and bounds is not currently
+ * necessary in the only usages of this method, but enables
+ * use in other future contexts.
*/
final void tryAwaitLock(Node[] tab, int i) {
- if (tab != null && i >= 0 && i < tab.length) { // bounds check
+ if (tab != null && i >= 0 && i < tab.length) { // sanity check
int r = ThreadLocalRandom.current().nextInt(); // randomize spins
int spins = MAX_SPINS, h;
while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) {
@@ -712,11 +719,11 @@ public class ConcurrentHashMapV8
}
/**
- * Return the TreeNode (or null if not found) for the given key
+ * Returns the TreeNode (or null if not found) for the given key
* starting at given root.
*/
- @SuppressWarnings("unchecked") // suppress Comparable cast warning
- final TreeNode getTreeNode(int h, Object k, TreeNode p) {
+ @SuppressWarnings("unchecked") final TreeNode getTreeNode
+ (int h, Object k, TreeNode p) {
Class> c = k.getClass();
while (p != null) {
int dir, ph; Object pk; Class> pc;
@@ -776,8 +783,8 @@ public class ConcurrentHashMapV8
* Finds or adds a node.
* @return null if added
*/
- @SuppressWarnings("unchecked") // suppress Comparable cast warning
- final TreeNode putTreeNode(int h, Object k, Object v) {
+ @SuppressWarnings("unchecked") final TreeNode putTreeNode
+ (int h, Object k, Object v) {
Class> c = k.getClass();
TreeNode pp = root, p = null;
int dir = 0;
@@ -1204,7 +1211,7 @@ public class ConcurrentHashMapV8
}
/*
- * Internal versions of the five insertion methods, each a
+ * Internal versions of the six insertion methods, each a
* little more complicated than the last. All have
* the same basic structure as the first (internalPut):
* 1. If table uninitialized, create
@@ -1222,6 +1229,8 @@ public class ConcurrentHashMapV8
* returns from function call.
* * compute uses the same function-call mechanics, but without
* the prescans
+ * * merge acts as putIfAbsent in the absent case, but invokes the
+ * update function if present
* * putAll attempts to pre-allocate enough table space
* and more lazily performs count updates and checks.
*
@@ -1545,9 +1554,8 @@ public class ConcurrentHashMapV8
}
/** Implementation for compute */
- @SuppressWarnings("unchecked")
- private final Object internalCompute(K k, boolean onlyIfPresent,
- BiFun super K, ? super V, ? extends V> mf) {
+ @SuppressWarnings("unchecked") private final Object internalCompute
+ (K k, boolean onlyIfPresent, BiFun super K, ? super V, ? extends V> mf) {
int h = spread(k.hashCode());
Object val = null;
int delta = 0;
@@ -1670,8 +1678,9 @@ public class ConcurrentHashMapV8
return val;
}
- private final Object internalMerge(K k, V v,
- BiFun super V, ? super V, ? extends V> mf) {
+ /** Implementation for merge */
+ @SuppressWarnings("unchecked") private final Object internalMerge
+ (K k, V v, BiFun super V, ? super V, ? extends V> mf) {
int h = spread(k.hashCode());
Object val = null;
int delta = 0;
@@ -2001,7 +2010,7 @@ public class ConcurrentHashMapV8
for (int i = bin;;) { // start upwards sweep
int fh; Node f;
if ((f = tabAt(tab, i)) == null) {
- if (bin >= 0) { // no lock needed (or available)
+ if (bin >= 0) { // Unbuffered; no lock needed (or available)
if (!casTabAt(tab, i, f, fwd))
continue;
}
@@ -2177,8 +2186,10 @@ public class ConcurrentHashMapV8
try {
if (tabAt(tab, i) == f) {
for (Node p = t.first; p != null; p = p.next) {
- p.val = null;
- --delta;
+ if (p.val != null) { // (currently always true)
+ p.val = null;
+ --delta;
+ }
}
t.first = null;
t.root = null;
@@ -2200,8 +2211,10 @@ public class ConcurrentHashMapV8
try {
if (tabAt(tab, i) == f) {
for (Node e = f; e != null; e = e.next) {
- e.val = null;
- --delta;
+ if (e.val != null) { // (currently always true)
+ e.val = null;
+ --delta;
+ }
}
setTabAt(tab, i, null);
++i;
@@ -2222,7 +2235,7 @@ public class ConcurrentHashMapV8
/**
* Encapsulates traversal for methods such as containsValue; also
- * serves as a base class for other iterators.
+ * serves as a base class for other iterators and bulk tasks.
*
* At each step, the iterator snapshots the key ("nextKey") and
* value ("nextVal") of a valid node (i.e., one that, at point of
@@ -2260,9 +2273,11 @@ public class ConcurrentHashMapV8
* This class extends ForkJoinTask to streamline parallel
* iteration in bulk operations (see BulkTask). This adds only an
* int of space overhead, which is close enough to negligible in
- * cases where it is not needed to not worry about it.
+ * cases where it is not needed to not worry about it. Because
+ * ForkJoinTask is Serializable, but iterators need not be, we
+ * need to add warning suppressions.
*/
- static class Traverser extends ForkJoinTask {
+ @SuppressWarnings("serial") static class Traverser extends ForkJoinTask {
final ConcurrentHashMapV8 map;
Node next; // the next entry to use
Node last; // the last entry used
@@ -2272,27 +2287,25 @@ public class ConcurrentHashMapV8
int index; // index of bin to use next
int baseIndex; // current index of initial table
int baseLimit; // index bound for initial table
- final int baseSize; // initial table size
+ int baseSize; // initial table size
/** Creates iterator for all entries in the table. */
Traverser(ConcurrentHashMapV8 map) {
- this.tab = (this.map = map).table;
- baseLimit = baseSize = (tab == null) ? 0 : tab.length;
+ this.map = map;
}
/** Creates iterator for split() methods */
- Traverser(Traverser it, boolean split) {
- this.map = it.map;
- this.tab = it.tab;
+ Traverser(Traverser it) {
+ ConcurrentHashMapV8 m; Node[] t;
+ if ((m = this.map = it.map) == null)
+ t = null;
+ else if ((t = it.tab) == null && // force parent tab initialization
+ (t = it.tab = m.table) != null)
+ it.baseLimit = it.baseSize = t.length;
+ this.tab = t;
this.baseSize = it.baseSize;
- int lo = it.baseIndex;
- int hi = this.baseLimit = it.baseLimit;
- int i;
- if (split) // adjust parent
- i = it.baseLimit = (lo + hi + 1) >>> 1;
- else // clone parent
- i = lo;
- this.index = this.baseIndex = i;
+ it.baseLimit = this.index = this.baseIndex =
+ ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1;
}
/**
@@ -2306,11 +2319,18 @@ public class ConcurrentHashMapV8
if (e != null) // advance past used/skipped node
e = e.next;
while (e == null) { // get to next non-null bin
+ ConcurrentHashMapV8 m;
Node[] t; int b, i, n; Object ek; // checks must use locals
- if ((b = baseIndex) >= baseLimit || (i = index) < 0 ||
- (t = tab) == null || i >= (n = t.length))
+ if ((t = tab) != null)
+ n = t.length;
+ else if ((m = map) != null && (t = tab = m.table) != null)
+ n = baseLimit = baseSize = t.length;
+ else
break outer;
- else if ((e = tabAt(t, i)) != null && e.hash == MOVED) {
+ if ((b = baseIndex) >= baseLimit ||
+ (i = index) < 0 || i >= n)
+ break outer;
+ if ((e = tabAt(t, i)) != null && e.hash == MOVED) {
if ((ek = e.key) instanceof TreeBin)
e = ((TreeBin)ek).first;
else {
@@ -2327,7 +2347,7 @@ public class ConcurrentHashMapV8
}
public final void remove() {
- if (nextVal == null)
+ if (nextVal == null && last == null)
advance();
Node e = last;
if (e == null)
@@ -2458,13 +2478,13 @@ public class ConcurrentHashMapV8
* instead of {@link #size} because a ConcurrentHashMap may
* contain more mappings than can be represented as an int. The
* value returned is a snapshot; the actual count may differ if
- * there are ongoing concurrent insertions of removals.
+ * there are ongoing concurrent insertions or removals.
*
* @return the number of mappings
*/
public long mappingCount() {
long n = counter.sum();
- return (n < 0L) ? 0L : n;
+ return (n < 0L) ? 0L : n; // ignore transient negative values
}
/**
@@ -2478,14 +2498,30 @@ public class ConcurrentHashMapV8
*
* @throws NullPointerException if the specified key is null
*/
- @SuppressWarnings("unchecked")
- public V get(Object key) {
+ @SuppressWarnings("unchecked") public V get(Object key) {
if (key == null)
throw new NullPointerException();
return (V)internalGet(key);
}
/**
+ * Returns the value to which the specified key is mapped,
+ * or the given defaultValue if this map contains no mapping for the key.
+ *
+ * @param key the key
+ * @param defaultValue the value to return if this map contains
+ * no mapping for the given key
+ * @return the mapping for the key, if present; else the defaultValue
+ * @throws NullPointerException if the specified key is null
+ */
+ @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) {
+ if (key == null)
+ throw new NullPointerException();
+ V v = (V) internalGet(key);
+ return v == null ? defaultValue : v;
+ }
+
+ /**
* Tests if the specified object is a key in this table.
*
* @param key possible key
@@ -2554,8 +2590,7 @@ public class ConcurrentHashMapV8
* {@code null} if there was no mapping for {@code key}
* @throws NullPointerException if the specified key or value is null
*/
- @SuppressWarnings("unchecked")
- public V put(K key, V value) {
+ @SuppressWarnings("unchecked") public V put(K key, V value) {
if (key == null || value == null)
throw new NullPointerException();
return (V)internalPut(key, value);
@@ -2568,8 +2603,7 @@ public class ConcurrentHashMapV8
* or {@code null} if there was no mapping for the key
* @throws NullPointerException if the specified key or value is null
*/
- @SuppressWarnings("unchecked")
- public V putIfAbsent(K key, V value) {
+ @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) {
if (key == null || value == null)
throw new NullPointerException();
return (V)internalPutIfAbsent(key, value);
@@ -2616,7 +2650,7 @@ public class ConcurrentHashMapV8
* @param key key with which the specified value is to be associated
* @param mappingFunction the function to compute a value
* @return the current (existing or computed) value associated with
- * the specified key, or null if the computed value is null.
+ * the specified key, or null if the computed value is null
* @throws NullPointerException if the specified key or mappingFunction
* is null
* @throws IllegalStateException if the computation detectably
@@ -2625,8 +2659,8 @@ public class ConcurrentHashMapV8
* @throws RuntimeException or Error if the mappingFunction does so,
* in which case the mapping is left unestablished
*/
- @SuppressWarnings("unchecked")
- public V computeIfAbsent(K key, Fun super K, ? extends V> mappingFunction) {
+ @SuppressWarnings("unchecked") public V computeIfAbsent
+ (K key, Fun super K, ? extends V> mappingFunction) {
if (key == null || mappingFunction == null)
throw new NullPointerException();
return (V)internalComputeIfAbsent(key, mappingFunction);
@@ -2657,8 +2691,7 @@ public class ConcurrentHashMapV8
*
* @param key key with which the specified value is to be associated
* @param remappingFunction the function to compute a value
- * @return the new value associated with
- * the specified key, or null if none.
+ * @return the new value associated with the specified key, or null if none
* @throws NullPointerException if the specified key or remappingFunction
* is null
* @throws IllegalStateException if the computation detectably
@@ -2667,7 +2700,8 @@ public class ConcurrentHashMapV8
* @throws RuntimeException or Error if the remappingFunction does so,
* in which case the mapping is unchanged
*/
- public V computeIfPresent(K key, BiFun super K, ? super V, ? extends V> remappingFunction) {
+ @SuppressWarnings("unchecked") public V computeIfPresent
+ (K key, BiFun super K, ? super V, ? extends V> remappingFunction) {
if (key == null || remappingFunction == null)
throw new NullPointerException();
return (V)internalCompute(key, true, remappingFunction);
@@ -2704,8 +2738,7 @@ public class ConcurrentHashMapV8
*
* @param key key with which the specified value is to be associated
* @param remappingFunction the function to compute a value
- * @return the new value associated with
- * the specified key, or null if none.
+ * @return the new value associated with the specified key, or null if none
* @throws NullPointerException if the specified key or remappingFunction
* is null
* @throws IllegalStateException if the computation detectably
@@ -2714,8 +2747,8 @@ public class ConcurrentHashMapV8
* @throws RuntimeException or Error if the remappingFunction does so,
* in which case the mapping is unchanged
*/
- // @SuppressWarnings("unchecked")
- public V compute(K key, BiFun super K, ? super V, ? extends V> remappingFunction) {
+ @SuppressWarnings("unchecked") public V compute
+ (K key, BiFun super K, ? super V, ? extends V> remappingFunction) {
if (key == null || remappingFunction == null)
throw new NullPointerException();
return (V)internalCompute(key, false, remappingFunction);
@@ -2746,8 +2779,8 @@ public class ConcurrentHashMapV8
* so the computation should be short and simple, and must not
* attempt to update any other mappings of this Map.
*/
- // @SuppressWarnings("unchecked")
- public V merge(K key, V value, BiFun super V, ? super V, ? extends V> remappingFunction) {
+ @SuppressWarnings("unchecked") public V merge
+ (K key, V value, BiFun super V, ? super V, ? extends V> remappingFunction) {
if (key == null || value == null || remappingFunction == null)
throw new NullPointerException();
return (V)internalMerge(key, value, remappingFunction);
@@ -2762,8 +2795,7 @@ public class ConcurrentHashMapV8
* {@code null} if there was no mapping for {@code key}
* @throws NullPointerException if the specified key is null
*/
- @SuppressWarnings("unchecked")
- public V remove(Object key) {
+ @SuppressWarnings("unchecked") public V remove(Object key) {
if (key == null)
throw new NullPointerException();
return (V)internalReplace(key, null, null);
@@ -2800,8 +2832,7 @@ public class ConcurrentHashMapV8
* or {@code null} if there was no mapping for the key
* @throws NullPointerException if the specified key or value is null
*/
- @SuppressWarnings("unchecked")
- public V replace(K key, V value) {
+ @SuppressWarnings("unchecked") public V replace(K key, V value) {
if (key == null || value == null)
throw new NullPointerException();
return (V)internalReplace(key, value, null);
@@ -2898,27 +2929,27 @@ public class ConcurrentHashMapV8
}
/**
- * Returns a partionable iterator of the keys in this map.
+ * Returns a partitionable iterator of the keys in this map.
*
- * @return a partionable iterator of the keys in this map
+ * @return a partitionable iterator of the keys in this map
*/
public Spliterator keySpliterator() {
return new KeyIterator(this);
}
/**
- * Returns a partionable iterator of the values in this map.
+ * Returns a partitionable iterator of the values in this map.
*
- * @return a partionable iterator of the values in this map
+ * @return a partitionable iterator of the values in this map
*/
public Spliterator valueSpliterator() {
return new ValueIterator(this);
}
/**
- * Returns a partionable iterator of the entries in this map.
+ * Returns a partitionable iterator of the entries in this map.
*
- * @return a partionable iterator of the entries in this map
+ * @return a partitionable iterator of the entries in this map
*/
public Spliterator> entrySpliterator() {
return new EntryIterator(this);
@@ -3007,19 +3038,18 @@ public class ConcurrentHashMapV8
/* ----------------Iterators -------------- */
- static final class KeyIterator extends Traverser
+ @SuppressWarnings("serial") static final class KeyIterator extends Traverser
implements Spliterator, Enumeration {
KeyIterator(ConcurrentHashMapV8 map) { super(map); }
- KeyIterator(Traverser it, boolean split) {
- super(it, split);
+ KeyIterator(Traverser it) {
+ super(it);
}
public KeyIterator split() {
if (last != null || (next != null && nextVal == null))
throw new IllegalStateException();
- return new KeyIterator(this, true);
+ return new KeyIterator(this);
}
- @SuppressWarnings("unchecked")
- public final K next() {
+ @SuppressWarnings("unchecked") public final K next() {
if (nextVal == null && advance() == null)
throw new NoSuchElementException();
Object k = nextKey;
@@ -3030,20 +3060,19 @@ public class ConcurrentHashMapV8
public final K nextElement() { return next(); }
}
- static final class ValueIterator extends Traverser
+ @SuppressWarnings("serial") static final class ValueIterator extends Traverser
implements Spliterator, Enumeration {
ValueIterator(ConcurrentHashMapV8 map) { super(map); }
- ValueIterator(Traverser it, boolean split) {
- super(it, split);
+ ValueIterator(Traverser it) {
+ super(it);
}
public ValueIterator split() {
if (last != null || (next != null && nextVal == null))
throw new IllegalStateException();
- return new ValueIterator(this, true);
+ return new ValueIterator(this);
}
- @SuppressWarnings("unchecked")
- public final V next() {
+ @SuppressWarnings("unchecked") public final V next() {
Object v;
if ((v = nextVal) == null && (v = advance()) == null)
throw new NoSuchElementException();
@@ -3054,20 +3083,19 @@ public class ConcurrentHashMapV8
public final V nextElement() { return next(); }
}
- static final class EntryIterator extends Traverser
+ @SuppressWarnings("serial") static final class EntryIterator extends Traverser
implements Spliterator> {
EntryIterator(ConcurrentHashMapV8 map) { super(map); }
- EntryIterator(Traverser it, boolean split) {
- super(it, split);
+ EntryIterator(Traverser it) {
+ super(it);
}
public EntryIterator split() {
if (last != null || (next != null && nextVal == null))
throw new IllegalStateException();
- return new EntryIterator(this, true);
+ return new EntryIterator(this);
}
- @SuppressWarnings("unchecked")
- public final Map.Entry next() {
+ @SuppressWarnings("unchecked") public final Map.Entry next() {
Object v;
if ((v = nextVal) == null && (v = advance()) == null)
throw new NoSuchElementException();
@@ -3162,8 +3190,7 @@ public class ConcurrentHashMapV8
return (i == n) ? r : Arrays.copyOf(r, i);
}
- @SuppressWarnings("unchecked")
- public final T[] toArray(T[] a) {
+ @SuppressWarnings("unchecked") public final T[] toArray(T[] a) {
long sz = map.mappingCount();
if (sz > (long)(MAX_ARRAY_SIZE))
throw new OutOfMemoryError(oomeMsg);
@@ -3359,8 +3386,7 @@ public class ConcurrentHashMapV8
* for each key-value mapping, followed by a null pair.
* The key-value mappings are emitted in no particular order.
*/
- @SuppressWarnings("unchecked")
- private void writeObject(java.io.ObjectOutputStream s)
+ @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
if (segments == null) { // for serialization compatibility
segments = (Segment[])
@@ -3384,8 +3410,7 @@ public class ConcurrentHashMapV8
* Reconstitutes the instance from a stream (that is, deserializes it).
* @param s the stream
*/
- @SuppressWarnings("unchecked")
- private void readObject(java.io.ObjectInputStream s)
+ @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
this.segments = null; // unneeded
@@ -3518,7 +3543,7 @@ public class ConcurrentHashMapV8
/**
* An extended view of a ConcurrentHashMap supporting bulk
- * parallel operations. These operations are designed to be be
+ * parallel operations. These operations are designed to be
* safely, and often sensibly, applied even with maps that are
* being concurrently updated by other threads; for example, when
* computing a snapshot summary of the values in a shared
@@ -3636,7 +3661,7 @@ public class ConcurrentHashMapV8
*
* @param action the action
*/
- public void forEach(BiAction action) {
+ public void forEach(BiAction action) {
fjp.invoke(ForkJoinTasks.forEach
(ConcurrentHashMapV8.this, action));
}
@@ -3646,11 +3671,11 @@ public class ConcurrentHashMapV8
* of each (key, value).
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
*/
- public void forEach(BiFun super K, ? super V, ? extends U> transformer,
+ public void forEach(BiFun super K, ? super V, ? extends U> transformer,
Action action) {
fjp.invoke(ForkJoinTasks.forEach
(ConcurrentHashMapV8.this, transformer, action));
@@ -3658,10 +3683,10 @@ public class ConcurrentHashMapV8
/**
* Returns a non-null result from applying the given search
- * function on each (key, value), or null if none. Further
- * element processing is suppressed upon success. However,
- * this method does not return until other in-progress
- * parallel invocations of the search function also complete.
+ * function on each (key, value), or null if none. Upon
+ * success, further element processing is suppressed and the
+ * results of any other parallel invocations of the search
+ * function are ignored.
*
* @param searchFunction a function returning a non-null
* result on success, else null
@@ -3679,8 +3704,8 @@ public class ConcurrentHashMapV8
* combine values, or null if none.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case it is not combined).
+ * for an element, or null if there is no transformation (in
+ * which case it is not combined)
* @param reducer a commutative associative combining function
* @return the result of accumulating the given transformation
* of all (key, value) pairs
@@ -3720,8 +3745,7 @@ public class ConcurrentHashMapV8
* @param basis the identity (initial default value) for the reduction
* @param reducer a commutative associative combining function
* @return the result of accumulating the given transformation
- * of all (key, value) pairs using the given reducer to
- * combine values, and the given basis as an identity value.
+ * of all (key, value) pairs
*/
public long reduceToLong(ObjectByObjectToLong super K, ? super V> transformer,
long basis,
@@ -3750,25 +3774,25 @@ public class ConcurrentHashMapV8
}
/**
- * Performs the given action for each key
+ * Performs the given action for each key.
*
* @param action the action
*/
- public void forEachKey(Action action) {
+ public void forEachKey(Action action) {
fjp.invoke(ForkJoinTasks.forEachKey
(ConcurrentHashMapV8.this, action));
}
/**
* Performs the given action for each non-null transformation
- * of each key
+ * of each key.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
*/
- public void forEachKey(Fun super K, ? extends U> transformer,
+ public void forEachKey(Fun super K, ? extends U> transformer,
Action action) {
fjp.invoke(ForkJoinTasks.forEachKey
(ConcurrentHashMapV8.this, transformer, action));
@@ -3776,10 +3800,10 @@ public class ConcurrentHashMapV8
/**
* Returns a non-null result from applying the given search
- * function on each key, or null if none. Further element
- * processing is suppressed upon success. However, this method
- * does not return until other in-progress parallel
- * invocations of the search function also complete.
+ * function on each key, or null if none. Upon success,
+ * further element processing is suppressed and the results of
+ * any other parallel invocations of the search function are
+ * ignored.
*
* @param searchFunction a function returning a non-null
* result on success, else null
@@ -3810,8 +3834,8 @@ public class ConcurrentHashMapV8
* null if none.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case it is not combined).
+ * for an element, or null if there is no transformation (in
+ * which case it is not combined)
* @param reducer a commutative associative combining function
* @return the result of accumulating the given transformation
* of all keys
@@ -3880,24 +3904,24 @@ public class ConcurrentHashMapV8
}
/**
- * Performs the given action for each value
+ * Performs the given action for each value.
*
* @param action the action
*/
- public void forEachValue(Action action) {
+ public void forEachValue(Action action) {
fjp.invoke(ForkJoinTasks.forEachValue
(ConcurrentHashMapV8.this, action));
}
/**
* Performs the given action for each non-null transformation
- * of each value
+ * of each value.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
*/
- public void forEachValue(Fun super V, ? extends U> transformer,
+ public void forEachValue(Fun super V, ? extends U> transformer,
Action action) {
fjp.invoke(ForkJoinTasks.forEachValue
(ConcurrentHashMapV8.this, transformer, action));
@@ -3905,16 +3929,15 @@ public class ConcurrentHashMapV8
/**
* Returns a non-null result from applying the given search
- * function on each value, or null if none. Further element
- * processing is suppressed upon success. However, this method
- * does not return until other in-progress parallel
- * invocations of the search function also complete.
+ * function on each value, or null if none. Upon success,
+ * further element processing is suppressed and the results of
+ * any other parallel invocations of the search function are
+ * ignored.
*
* @param searchFunction a function returning a non-null
* result on success, else null
* @return a non-null result from applying the given search
* function on each value, or null if none
- *
*/
public U searchValues(Fun super V, ? extends U> searchFunction) {
return fjp.invoke(ForkJoinTasks.searchValues
@@ -3939,8 +3962,8 @@ public class ConcurrentHashMapV8
* null if none.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case it is not combined).
+ * for an element, or null if there is no transformation (in
+ * which case it is not combined)
* @param reducer a commutative associative combining function
* @return the result of accumulating the given transformation
* of all values
@@ -4009,25 +4032,25 @@ public class ConcurrentHashMapV8
}
/**
- * Perform the given action for each entry
+ * Performs the given action for each entry.
*
* @param action the action
*/
- public void forEachEntry(Action> action) {
+ public void forEachEntry(Action> action) {
fjp.invoke(ForkJoinTasks.forEachEntry
(ConcurrentHashMapV8.this, action));
}
/**
- * Perform the given action for each non-null transformation
- * of each entry
+ * Performs the given action for each non-null transformation
+ * of each entry.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
*/
- public void forEachEntry(Fun, ? extends U> transformer,
+ public void forEachEntry(Fun, ? extends U> transformer,
Action action) {
fjp.invoke(ForkJoinTasks.forEachEntry
(ConcurrentHashMapV8.this, transformer, action));
@@ -4035,10 +4058,10 @@ public class ConcurrentHashMapV8
/**
* Returns a non-null result from applying the given search
- * function on each entry, or null if none. Further element
- * processing is suppressed upon success. However, this method
- * does not return until other in-progress parallel
- * invocations of the search function also complete.
+ * function on each entry, or null if none. Upon success,
+ * further element processing is suppressed and the results of
+ * any other parallel invocations of the search function are
+ * ignored.
*
* @param searchFunction a function returning a non-null
* result on success, else null
@@ -4068,7 +4091,7 @@ public class ConcurrentHashMapV8
* or null if none.
*
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
+ * for an element, or null if there is no transformation (in
* which case it is not combined).
* @param reducer a commutative associative combining function
* @return the result of accumulating the given transformation
@@ -4159,11 +4182,11 @@ public class ConcurrentHashMapV8
* @param action the action
* @return the task
*/
- public static ForkJoinTask forEach
+ public static ForkJoinTask forEach
(ConcurrentHashMapV8 map,
BiAction action) {
if (action == null) throw new NullPointerException();
- return new ForEachMappingTask(map, action);
+ return new ForEachMappingTask(map, null, -1, action);
}
/**
@@ -4172,28 +4195,27 @@ public class ConcurrentHashMapV8
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
* @return the task
*/
- public static ForkJoinTask forEach
+ public static ForkJoinTask forEach
(ConcurrentHashMapV8 map,
BiFun super K, ? super V, ? extends U> transformer,
Action action) {
if (transformer == null || action == null)
throw new NullPointerException();
return new ForEachTransformedMappingTask
- (map, transformer, action);
+ (map, null, -1, transformer, action);
}
/**
- * Returns a task that when invoked, returns a non-null
- * result from applying the given search function on each
- * (key, value), or null if none. Further element processing
- * is suppressed upon success. However, this method does not
- * return until other in-progress parallel invocations of the
- * search function also complete.
+ * Returns a task that when invoked, returns a non-null result
+ * from applying the given search function on each (key,
+ * value), or null if none. Upon success, further element
+ * processing is suppressed and the results of any other
+ * parallel invocations of the search function are ignored.
*
* @param map the map
* @param searchFunction a function returning a non-null
@@ -4205,7 +4227,7 @@ public class ConcurrentHashMapV8
BiFun super K, ? super V, ? extends U> searchFunction) {
if (searchFunction == null) throw new NullPointerException();
return new SearchMappingsTask
- (map, searchFunction,
+ (map, null, -1, searchFunction,
new AtomicReference());
}
@@ -4216,7 +4238,7 @@ public class ConcurrentHashMapV8
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
+ * for an element, or null if there is no transformation (in
* which case it is not combined).
* @param reducer a commutative associative combining function
* @return the task
@@ -4228,7 +4250,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceMappingsTask
- (map, transformer, reducer);
+ (map, null, -1, null, transformer, reducer);
}
/**
@@ -4252,7 +4274,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceMappingsToDoubleTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4276,7 +4298,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceMappingsToLongTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4299,52 +4321,51 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceMappingsToIntTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
* Returns a task that when invoked, performs the given action
- * for each key
+ * for each key.
*
* @param map the map
* @param action the action
* @return the task
*/
- public static ForkJoinTask forEachKey
+ public static ForkJoinTask forEachKey
(ConcurrentHashMapV8 map,
Action action) {
if (action == null) throw new NullPointerException();
- return new ForEachKeyTask(map, action);
+ return new ForEachKeyTask(map, null, -1, action);
}
/**
* Returns a task that when invoked, performs the given action
- * for each non-null transformation of each key
+ * for each non-null transformation of each key.
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
* @return the task
*/
- public static ForkJoinTask forEachKey
+ public static ForkJoinTask forEachKey
(ConcurrentHashMapV8 map,
Fun super K, ? extends U> transformer,
Action action) {
if (transformer == null || action == null)
throw new NullPointerException();
return new ForEachTransformedKeyTask
- (map, transformer, action);
+ (map, null, -1, transformer, action);
}
/**
* Returns a task that when invoked, returns a non-null result
* from applying the given search function on each key, or
- * null if none. Further element processing is suppressed
- * upon success. However, this method does not return until
- * other in-progress parallel invocations of the search
- * function also complete.
+ * null if none. Upon success, further element processing is
+ * suppressed and the results of any other parallel
+ * invocations of the search function are ignored.
*
* @param map the map
* @param searchFunction a function returning a non-null
@@ -4356,7 +4377,7 @@ public class ConcurrentHashMapV8
Fun super K, ? extends U> searchFunction) {
if (searchFunction == null) throw new NullPointerException();
return new SearchKeysTask
- (map, searchFunction,
+ (map, null, -1, searchFunction,
new AtomicReference());
}
@@ -4374,8 +4395,9 @@ public class ConcurrentHashMapV8
BiFun super K, ? super K, ? extends K> reducer) {
if (reducer == null) throw new NullPointerException();
return new ReduceKeysTask
- (map, reducer);
+ (map, null, -1, null, reducer);
}
+
/**
* Returns a task that when invoked, returns the result of
* accumulating the given transformation of all keys using the given
@@ -4383,7 +4405,7 @@ public class ConcurrentHashMapV8
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
+ * for an element, or null if there is no transformation (in
* which case it is not combined).
* @param reducer a commutative associative combining function
* @return the task
@@ -4395,7 +4417,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceKeysTask
- (map, transformer, reducer);
+ (map, null, -1, null, transformer, reducer);
}
/**
@@ -4419,7 +4441,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceKeysToDoubleTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4443,7 +4465,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceKeysToLongTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4467,63 +4489,61 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceKeysToIntTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
* Returns a task that when invoked, performs the given action
- * for each value
+ * for each value.
*
* @param map the map
* @param action the action
*/
- public static ForkJoinTask forEachValue
+ public static ForkJoinTask forEachValue
(ConcurrentHashMapV8 map,
Action action) {
if (action == null) throw new NullPointerException();
- return new ForEachValueTask(map, action);
+ return new ForEachValueTask(map, null, -1, action);
}
/**
* Returns a task that when invoked, performs the given action
- * for each non-null transformation of each value
+ * for each non-null transformation of each value.
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
*/
- public static ForkJoinTask forEachValue
+ public static ForkJoinTask forEachValue
(ConcurrentHashMapV8 map,
Fun super V, ? extends U> transformer,
Action action) {
if (transformer == null || action == null)
throw new NullPointerException();
return new ForEachTransformedValueTask
- (map, transformer, action);
+ (map, null, -1, transformer, action);
}
/**
* Returns a task that when invoked, returns a non-null result
* from applying the given search function on each value, or
- * null if none. Further element processing is suppressed
- * upon success. However, this method does not return until
- * other in-progress parallel invocations of the search
- * function also complete.
+ * null if none. Upon success, further element processing is
+ * suppressed and the results of any other parallel
+ * invocations of the search function are ignored.
*
* @param map the map
* @param searchFunction a function returning a non-null
* result on success, else null
* @return the task
- *
*/
public static ForkJoinTask searchValues
(ConcurrentHashMapV8 map,
Fun super V, ? extends U> searchFunction) {
if (searchFunction == null) throw new NullPointerException();
return new SearchValuesTask
- (map, searchFunction,
+ (map, null, -1, searchFunction,
new AtomicReference());
}
@@ -4541,7 +4561,7 @@ public class ConcurrentHashMapV8
BiFun super V, ? super V, ? extends V> reducer) {
if (reducer == null) throw new NullPointerException();
return new ReduceValuesTask
- (map, reducer);
+ (map, null, -1, null, reducer);
}
/**
@@ -4551,7 +4571,7 @@ public class ConcurrentHashMapV8
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
+ * for an element, or null if there is no transformation (in
* which case it is not combined).
* @param reducer a commutative associative combining function
* @return the task
@@ -4563,7 +4583,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceValuesTask
- (map, transformer, reducer);
+ (map, null, -1, null, transformer, reducer);
}
/**
@@ -4587,7 +4607,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceValuesToDoubleTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4611,7 +4631,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceValuesToLongTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4635,63 +4655,61 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceValuesToIntTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
* Returns a task that when invoked, perform the given action
- * for each entry
+ * for each entry.
*
* @param map the map
* @param action the action
*/
- public static ForkJoinTask forEachEntry
+ public static ForkJoinTask forEachEntry
(ConcurrentHashMapV8 map,
Action> action) {
if (action == null) throw new NullPointerException();
- return new ForEachEntryTask(map, action);
+ return new ForEachEntryTask(map, null, -1, action);
}
/**
* Returns a task that when invoked, perform the given action
- * for each non-null transformation of each entry
+ * for each non-null transformation of each entry.
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
- * which case the action is not applied).
+ * for an element, or null if there is no transformation (in
+ * which case the action is not applied)
* @param action the action
*/
- public static ForkJoinTask forEachEntry
+ public static ForkJoinTask forEachEntry
(ConcurrentHashMapV8 map,
Fun, ? extends U> transformer,
Action action) {
if (transformer == null || action == null)
throw new NullPointerException();
return new ForEachTransformedEntryTask
- (map, transformer, action);
+ (map, null, -1, transformer, action);
}
/**
* Returns a task that when invoked, returns a non-null result
* from applying the given search function on each entry, or
- * null if none. Further element processing is suppressed
- * upon success. However, this method does not return until
- * other in-progress parallel invocations of the search
- * function also complete.
+ * null if none. Upon success, further element processing is
+ * suppressed and the results of any other parallel
+ * invocations of the search function are ignored.
*
* @param map the map
* @param searchFunction a function returning a non-null
* result on success, else null
* @return the task
- *
*/
public static ForkJoinTask searchEntries
(ConcurrentHashMapV8 map,
Fun, ? extends U> searchFunction) {
if (searchFunction == null) throw new NullPointerException();
return new SearchEntriesTask
- (map, searchFunction,
+ (map, null, -1, searchFunction,
new AtomicReference());
}
@@ -4709,7 +4727,7 @@ public class ConcurrentHashMapV8
BiFun, Map.Entry, ? extends Map.Entry> reducer) {
if (reducer == null) throw new NullPointerException();
return new ReduceEntriesTask
- (map, reducer);
+ (map, null, -1, null, reducer);
}
/**
@@ -4719,7 +4737,7 @@ public class ConcurrentHashMapV8
*
* @param map the map
* @param transformer a function returning the transformation
- * for an element, or null of there is no transformation (in
+ * for an element, or null if there is no transformation (in
* which case it is not combined).
* @param reducer a commutative associative combining function
* @return the task
@@ -4731,7 +4749,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceEntriesTask
- (map, transformer, reducer);
+ (map, null, -1, null, transformer, reducer);
}
/**
@@ -4755,7 +4773,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceEntriesToDoubleTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4779,7 +4797,7 @@ public class ConcurrentHashMapV8
if (transformer == null || reducer == null)
throw new NullPointerException();
return new MapReduceEntriesToLongTask
- (map, transformer, basis, reducer);
+ (map, null, -1, null, transformer, basis, reducer);
}
/**
@@ -4803,7 +4821,7 @@ public class ConcurrentHashMapV8