java.util.Hashtable , and
includes versions of methods corresponding to each method of
Hashtable. However, even though all operations are
thread-safe, retrieval operations do not entail locking,
and there is not any support for locking the entire table
in a way that prevents all access. This class is fully
interoperable with Hashtable in programs that rely on its
thread safety but not on its synchronization details.
Retrieval operations (including get) generally do not
block, so may overlap with update operations (including put
and remove). Retrievals reflect the results of the most
recently completed update operations holding upon their
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 putAll and 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 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 size, isEmpty, and 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
the same slot modulo the table size), with the expected average
effect of maintaining roughly two bins per mapping (corresponding
to a 0.75 load factor threshold for resizing). There may be much
variance around this average as mappings are added and removed, but
overall, this maintains a commonly accepted time/space tradeoff for
hash tables. However, resizing this or any other kind of hash
table may be a relatively slow operation. When possible, it is a
good idea to provide a size estimate as an optional initialCapacity constructor argument. An additional optional
loadFactor constructor argument provides a further means of
customizing initial table capacity by specifying the table density
to be used in calculating the amount of space to allocate for the
given number of elements. Also, for compatibility with previous
versions of this class, constructors may optionally specify an
expected concurrencyLevel as an additional hint for
internal sizing. Note that using many keys with exactly the same
hashCode() is a sure way to slow down performance of any
hash table.
A Set projection of a ConcurrentHashMap may be created
(using newKeySet() or newKeySet(int)), or viewed
(using keySet(Object) when only keys are of interest, and the
mapped values are (perhaps transiently) not used or all take the
same mapping value.
A ConcurrentHashMap can be used as scalable frequency map (a
form of histogram or multiset) by using LongAdder values
and initializing via computeIfAbsent. For example, to add
a count to a ConcurrentHashMap<String,LongAdder> freqs, you
can use freqs.computeIfAbsent(k -> new
LongAdder()).increment();
This class and its views and iterators implement all of the
optional methods of the Map and Iterator
interfaces.
Like Hashtable but unlike HashMap, this class
does not allow null to be used as a key or value.
ConcurrentHashMaps support parallel operations using the
ForkJoinPool#commonPool. (Tasks that may be used in other contexts
are available in class ForkJoinTasks). 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
registry. There are three kinds of operation, each with four
forms, accepting functions with Keys, Values, Entries, and (Key,
Value) arguments and/or return values. (The first three forms are
also available via the keySet(), values() and
entrySet() views). Because the elements of a
ConcurrentHashMap are not ordered in any particular way, and may be
processed in different orders in different parallel executions, the
correctness of supplied functions should not depend on any
ordering, or on any other objects or values that may transiently
change while computation is in progress; and except for forEach
actions, should ideally be side-effect-free.
The concurrency properties of bulk operations follow
from those of ConcurrentHashMap: Any non-null result returned
from get(key) and related access methods bears a
happens-before relation with the associated insertion or
update. The result of any bulk operation reflects the
composition of these per-element relations (but is not
necessarily atomic with respect to the map as a whole unless it
is somehow known to be quiescent). Conversely, because keys
and values in the map are never null, null serves as a reliable
atomic indicator of the current lack of any result. To
maintain this property, null serves as an implicit basis for
all non-scalar reduction operations. For the double, long, and
int versions, the basis should be one that, when combined with
any other value, returns that other value (more formally, it
should be the identity element for the reduction). Most common
reductions have these properties; for example, computing a sum
with basis 0 or a minimum with basis MAX_VALUE.
Search and transformation functions provided as arguments should similarly return null to indicate the lack of any result (in which case it is not used). In the case of mapped reductions, this also enables transformations to serve as filters, returning null (or, in the case of primitive specializations, the identity basis) if the element should not be combined. You can create compound transformations and filterings by composing them yourself under this "null means there is nothing there now" rule before using them in search or reduce operations.
Methods accepting and/or returning Entry arguments maintain
key-value associations. They may be useful for example when
finding the key for the greatest value. Note that "plain" Entry
arguments can be supplied using new
AbstractMap.SimpleEntry(k,v).
Bulk operations may complete abruptly, throwing an exception encountered in the application of a supplied function. Bear in mind when handling such exceptions that other concurrently executing functions could also have thrown exceptions, or would have done so if the first exception had not occurred.
Parallel speedups for bulk operations compared to sequential processing are common but not guaranteed. Operations involving brief functions on small maps may execute more slowly than sequential loops if the underlying work to parallelize the computation is more expensive than the computation itself. Similarly, parallelization may not lead to much actual parallelism if all processors are busy performing unrelated tasks.
All arguments to all task methods must be non-null.
JSR 166e Note
During transition, this class uses nested functional interfaces with different names but the same forms as those expected for JDK8.
This class is a member of the Java Collections Framework.
| Modifier and Type | Class and Description |
|---|---|
| pack-priv abstract static class | |
| pack-priv static class | |
| public static class | |
| pack-priv static class | |
| public static class | ConcurrentHashMap.KeySetView<K, V>
A view of a ConcurrentHashMap as a |
| pack-priv static class | |
| protected static class | ConcurrentHashMap.Node
Key-value entry. |
| protected static interface | |
| pack-priv static class | ConcurrentHashMap.Segment<K, V>
Stripped-down version of helper class used in previous version, declared for the sake of serialization compatibility |
| public static interface | |
| pack-priv static class | ConcurrentHashMap.Traverser<K, V, R>
Encapsulates traversal for methods such as containsValue; also serves as a base class for other iterators and bulk tasks. |
| pack-priv static class | ConcurrentHashMap.TreeBin
A specialized form of red-black tree for use in bins whose size exceeds a threshold. |
| protected static class | ConcurrentHashMap.TreeNode
Nodes for use in TreeBins |
| pack-priv static class | |
| public static class | ConcurrentHashMap.ValuesView<K, V>
A view of a ConcurrentHashMap as a |
| Modifier and Type | Field and Description |
|---|---|
| private final transient LongAdder | counter
The counter maintaining number of elements. |
| private static final int | DEFAULT_CAPACITY
The default initial table capacity. |
| private static final int | DEFAULT_CONCURRENCY_LEVEL
The default concurrency level for this table. |
| private transient ConcurrentHashMap. | |
| protected static final ConcurrentHashMap. | |
| protected static final ConcurrentHashMap. | |
| pack-priv static final int | |
| private transient ConcurrentHashMap. | |
| private static final float | LOAD_FACTOR
The load factor for this table. |
| pack-priv static final int | |
| pack-priv static final int | MAX_ARRAY_SIZE
The largest possible (non-power of two) array size. |
| private static final int | MAXIMUM_CAPACITY
The largest possible table capacity. |
| pack-priv static final int | |
| private volatile PoolAccessor | |
| private ConcurrentHashMap. | segments
For serialization compatibility. |
| private static final long | |
| private transient volatile int | sizeCtl
Table initialization and resizing control. |
| private static final AtomicIntegerFieldUpdater | |
| pack-priv transient volatile AtomicReferenceArray | table
The array of bins. |
| private static final int | TRANSFER_BUFFER_SIZE
The buffer size for skipped bins during transfers. |
| private static final int | TREE_THRESHOLD
The bin count threshold for using a tree rather than list for a bin. |
| private transient ConcurrentHashMap. | |
| pack-priv static final int |
| Access | Constructor and Description |
|---|---|
| public | |
| public | ConcurrentHashMap(int
The implementation performs internal
sizing to accommodate this many elements. initialCapacity)Creates a new, empty map with an initial table size accommodating the specified number of elements without the need to dynamically resize. |
| public | ConcurrentHashMap(Map<? extends K, ? extends V>
the map m)Creates a new map with the same mappings as the given map. |
| public | ConcurrentHashMap(int
the initial capacity. The implementation
performs internal sizing to accommodate this many elements,
given the specified load factor. initialCapacity, float the load factor (table density) for
establishing the initial table size loadFactor)Creates a new, empty map with an initial table size based on
the given number of elements ( |
| public | ConcurrentHashMap(int
the initial capacity. The implementation
performs internal sizing to accommodate this many elements,
given the specified load factor. initialCapacity, float the load factor (table density) for
establishing the initial table size loadFactor, int the estimated number of concurrently
updating threads. The implementation may use this value as
a sizing hint. concurrencyLevel)Creates a new, empty map with an initial table size based on
the given number of elements ( |
| Modifier and Type | Method and Description |
|---|---|
| private static final boolean | casTabAt(AtomicReferenceArray<ConcurrentHashMap.
|
| private final void | checkForResize()
If table is too small and not already resizing, creates next table and transfers bins. |
| public void | |
| public boolean | |
| public boolean | Returns: true if and only if the specified object
is a key in this table, as determined by the
equals method; false otherwisepossible key key)Implements java. |
| public boolean | Returns: true if this map maps one or more keys to the
specified valuevalue whose presence in this map is to be tested value)Implements java. true if this map maps one or more keys to the
specified value.
|
| public Enumeration | Returns: an enumeration of the values in this tableReturns an enumeration of the values in this table. |
| pack-priv static <K, V> AbstractMap. | entryFor(K k, V v)
Returns exportable snapshot entry for the given key and value when write-through can't or shouldn't be used. |
| public Set | entrySet()
Implements java. Set view of the mappings contained in this map.
|
| public ConcurrentHashMap. | Returns: a partitionable iterator of the entries in this mapReturns a partitionable iterator of the entries in this map. |
| public boolean | Returns: true if the specified object is equal to this mapobject to be compared for equality with this map o)Overrides java. Implements java. |
| public V | get(Object
the key whose associated value is to be returned key)Implements java. null if this map contains no mapping for the key.
|
| public List | |
| public V | Returns: the mapping for the key, if present; else the defaultValuethe key key, V the value to return if this map contains
no mapping for the given key defaultValue)Returns the value to which the specified key is mapped, or the given defaultValue if this map contains no mapping for the key. |
| public int | Returns: the hash code value for this mapOverrides java. Implements java. Map, i.e.,
the sum of, for each key-value pair in the map,
key.hashCode() ^ value.hashCode().
|
| private final AtomicReferenceArray | |
| private final void | |
| private final Object | |
| private final Object | |
| private final void | |
| private final Object | |
| protected final Object | |
| private final Object | internalReplace(Object k, Object v, Object cv)
Implementation for the four public remove/replace methods: Replaces node value with v, conditional upon match of cv if non-null. |
| private final Object | |
| public boolean | |
| public Enumeration | Returns: an enumeration of the keys in this tableReturns an enumeration of the keys in this table. |
| public ConcurrentHashMap. | Returns: the set viewImplements java. Set view of the keys contained in this map.
|
| public ConcurrentHashMap. | Returns: the set viewthe mapped value to use for any
additions. mappedValue)Returns a |
| public ConcurrentHashMap. | Returns: a partitionable iterator of the keys in this mapReturns a partitionable iterator of the keys in this map. |
| public long | |
| public static <K> ConcurrentHashMap. | |
| public static <K> ConcurrentHashMap. | |
| public V | Returns: the previous value associated withkey, or
null if there was no mapping for keykey with which the specified value is to be associated key, V value to be associated with the specified key value)Implements java. |
| public void | putAll(Map<? extends K, ? extends V>
mappings to be stored in this map m)Implements java. |
| public V | Returns: the previous value associated with the specified key, ornull if there was no mapping for the keykey with which the specified value is to be associated key, V value to be associated with the specified key value)Implements java. |
| private static final AtomicReferenceArray | |
| public void | |
| public V | Returns: the previous value associated withkey, or
null if there was no mapping for keythe key that needs to be removed key)Implements java. |
| public boolean | remove(Object
key with which the specified value is associated key, Object value expected to be associated with the specified key value)Implements java. |
| protected boolean | |
| protected V | |
| protected V | |
| public boolean | replace(K
key with which the specified value is associated key, V value expected to be associated with the specified key oldValue, V value to be associated with the specified key newValue)Implements java. |
| public V | Returns: the previous value associated with the specified key, ornull if there was no mapping for the keykey with which the specified value is associated key, V value to be associated with the specified key value)Implements java. |
| private final void | replaceWithTreeBin(AtomicReferenceArray<ConcurrentHashMap.
Replaces a list bin with a tree bin. |
| protected void | |
| private static final void | |
| public int | |
| private static void | splitBin(AtomicReferenceArray<ConcurrentHashMap.
Splits a normal bin with list headed by e into lo and hi parts; installs in given table. |
| private static void | splitTreeBin(AtomicReferenceArray<ConcurrentHashMap.
Splits a tree bin into lo and hi parts; installs in given table. |
| private static final int | |
| pack-priv static final ConcurrentHashMap. | |
| private static final int | |
| public String | Returns: a string representation of this mapOverrides java. |
| private final void | tryPresize(int
number of elements (doesn't need to be perfectly accurate) size)Tries to presize table to accommodate the given number of elements. |
| public ConcurrentHashMap. | values()
Implements java. Collection view of the values contained in this map.
|
| public ConcurrentHashMap. | Returns: a partitionable iterator of the values in this mapReturns a partitionable iterator of the values in this map. |