|
FlexDoc/Javadoc 2.0 Demo Java Doc |
To maintain the specified guarantees, default implementations of methods including putIfAbsent(K, V) inherited from Map must be overridden by implementations of this interface. Similarly, implementations of the collections returned by methods Map.keySet(), Map.values(), and Map.entrySet() must override methods such as removeIf when necessary to preserve atomicity guarantees.
Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a ConcurrentMap as a key or value happen-before actions subsequent to the access or removal of that object from the ConcurrentMap in another thread.
This interface is a member of the Java Collections Framework.
Nested Class Summary |
Nested classes/interfaces inherited from interface java.util.Map |
Method Summary |
||
default V |
Attempts to compute a mapping for the specified key and its current
mapped value (or null if there is no current mapping).
|
|
default V |
If the specified key is not already associated with a value (or is mapped
to null), attempts to compute its value using the given mapping
function and enters it into this map unless null.
|
|
default V |
If the value for the specified key is present and non-null, attempts to
compute a new mapping given the key and its current mapped value.
|
|
default void |
Performs the given action for each entry in this map until all entries
have been processed or the action throws an exception.
|
|
default V |
Returns the value to which the specified key is mapped, or
defaultValue if this map contains no mapping for the key.
|
|
default V |
If the specified key is not already associated with a value or is
associated with null, associates it with the given non-null value.
|
|
If the specified key is not already associated
with a value, associates it with the given value.
|
||
boolean |
Removes the entry for a key only if currently mapped to a given value.
|
|
Replaces the entry for a key only if currently mapped to some value.
|
||
boolean |
Replaces the entry for a key only if currently mapped to a given value.
|
|
default void |
Replaces each entry's value with the result of invoking the given
function on that entry until all entries have been processed or the
function throws an exception.
|
Methods inherited from interface java.util.Map |
default V getOrDefault |
default void forEach |
for (Map.Entry<K,V> entry : map.entrySet()) {
action.accept(entry.getKey(), entry.getValue());
}
V putIfAbsent |
if (!map.containsKey(key))
return map.put(key, value);
else
return map.get(key);
except that the action is performed atomically.
boolean remove |
if (map.containsKey(key)
&& Objects.equals(map.get(key), value)) {
map.remove(key);
return true;
} else {
return false;
}
except that the action is performed atomically.
boolean replace |
if (map.containsKey(key)
&& Objects.equals(map.get(key), oldValue)) {
map.put(key, newValue);
return true;
} else {
return false;
}
except that the action is performed atomically.
V replace |
if (map.containsKey(key))
return map.put(key, value);
else
return null;
except that the action is performed atomically.
default void replaceAll |
The default implementation is equivalent to, for this map:
for (Map.Entry<K,V> entry : map.entrySet()) {
K k;
V v;
do {
k = entry.getKey();
v = entry.getValue();
} while (!map.replace(k, v, function.apply(k, v)));
}
The default implementation may retry these steps when multiple
threads attempt updates including potentially calling the function
repeatedly for a given key.
This implementation assumes that the ConcurrentMap cannot contain null values and get() returning null unambiguously means the key is absent. Implementations which support null values must override this default implementation.
default V computeIfAbsent |
If the mapping function returns null, no mapping is recorded. If the mapping function itself throws an (unchecked) exception, the exception is rethrown, and no mapping is recorded. The most common usage is to construct a new object serving as an initial mapped value or memoized result, as in:
map.computeIfAbsent(key, k -> new Value(f(k)));
Or to implement a multi-value map, Map<K,Collection<V>>, supporting multiple values per key:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
The mapping function should not modify this map during computation.
V oldValue, newValue;
return ((oldValue = map.get(key)) == null
&& (newValue = mappingFunction.apply(key)) != null
&& (oldValue = map.putIfAbsent(key, newValue)) == null)
? newValue
: oldValue;
This implementation assumes that the ConcurrentMap cannot contain null values and get() returning null unambiguously means the key is absent. Implementations which support null values must override this default implementation.
default V computeIfPresent |
If the remapping function returns null, the mapping is removed. If the remapping function itself throws an (unchecked) exception, the exception is rethrown, and the current mapping is left unchanged.
The remapping function should not modify this map during computation.
for (V oldValue; (oldValue = map.get(key)) != null; ) {
V newValue = remappingFunction.apply(key, oldValue);
if ((newValue == null)
? map.remove(key, oldValue)
: map.replace(key, oldValue, newValue))
return newValue;
}
return null;
When multiple threads attempt updates, map operations and the
remapping function may be called multiple times.
This implementation assumes that the ConcurrentMap cannot contain null values and get() returning null unambiguously means the key is absent. Implementations which support null values must override this default implementation.
default V compute |
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(Method merge() is often simpler to use for such purposes.)
If the remapping function returns null, the mapping is removed (or remains absent if initially absent). If the remapping function itself throws an (unchecked) exception, the exception is rethrown, and the current mapping is left unchanged.
The remapping function should not modify this map during computation.
for (;;) {
V oldValue = map.get(key);
V newValue = remappingFunction.apply(key, oldValue);
if (newValue != null) {
if ((oldValue != null)
? map.replace(key, oldValue, newValue)
: map.putIfAbsent(key, newValue) == null)
return newValue;
} else if (oldValue == null || map.remove(key, oldValue)) {
return null;
}
}
When multiple threads attempt updates, map operations and the
remapping function may be called multiple times.
This implementation assumes that the ConcurrentMap cannot contain null values and get() returning null unambiguously means the key is absent. Implementations which support null values must override this default implementation.
default V merge |
map.merge(key, msg, String::concat)
If the remapping function returns null, the mapping is removed. If the remapping function itself throws an (unchecked) exception, the exception is rethrown, and the current mapping is left unchanged.
The remapping function should not modify this map during computation.
for (;;) {
V oldValue = map.get(key);
if (oldValue != null) {
V newValue = remappingFunction.apply(oldValue, value);
if (newValue != null) {
if (map.replace(key, oldValue, newValue))
return newValue;
} else if (map.remove(key, oldValue)) {
return null;
}
} else if (map.putIfAbsent(key, value) == null) {
return value;
}
}
When multiple threads attempt updates, map operations and the
remapping function may be called multiple times.
This implementation assumes that the ConcurrentMap cannot contain null values and get() returning null unambiguously means the key is absent. Implementations which support null values must override this default implementation.
|
FlexDoc/Javadoc 2.0 Demo Java Doc |