K - the key typeV - the value type@ThreadSafe public abstract class CopyOnWriteMap<K,V> extends Object
Map in which all mutative
operations (the "destructive" operations described by Map
put, remove and so on) are implemented by making a fresh copy of the
underlying map.
This is ordinarily too costly, but may be more efficient than
alternatives when traversal operations vastly out-number mutations, and is
useful when you cannot or don't want to synchronize traversals, yet need to
preclude interference among concurrent threads. The "snapshot" style
iterators on the collections returned by entrySet(),
keySet() and values() use a reference to the internal map
at the point that the iterator was created. This map never changes during the
lifetime of the iterator, so interference is impossible and the iterator is
guaranteed not to throw ConcurrentModificationException. The
iterators will not reflect additions, removals, or changes to the list since
the iterator was created. Removing elements via these iterators is not
supported. The mutable operations on these collections (remove, retain etc.)
are supported but as with the Map interface, add and addAll
are not and throw UnsupportedOperationException.
The actual copy is performed by an abstract copy(Map) method. The
method is responsible for the underlying Map implementation (for instance a
HashMap, TreeMap,
LinkedHashMap etc.) and therefore the semantics of what
this map will cope with as far as null keys and values, iteration ordering
etc. See the note below about suitable candidates for underlying Map
implementations
There are supplied implementations for the common j.u.c Map
implementations via the CopyOnWriteMap
static CopyOnWriteMap.Builder.
Collection views of the keys, values and entries are optionally
live or stable. Live views
are modifiable will cause a copy if a modifying method is called on them.
Methods on these will reflect the current state of the collection, although
iterators will be snapshot style. If the collection views are stable they are
unmodifiable, and will be a snapshot of the state of the map at the time the
collection was asked for.
Please note that the thread-safety guarantees are limited to
the thread-safety of the non-mutative (non-destructive) operations of the
underlying map implementation. For instance some implementations such as
WeakHashMap and LinkedHashMap with access
ordering are actually structurally modified by the get(Object)
method and are therefore not suitable candidates as delegates for this class.
| Modifier and Type | Class and Description |
|---|---|
protected static class |
AbstractCopyOnWriteMap.CollectionView<E> |
static class |
AbstractCopyOnWriteMap.View<K,V>
Provides access to the views of the underlying key, value and entry
collections.
|
static class |
CopyOnWriteMap.Builder<K,V>
Build a
CopyOnWriteMap and specify all the options. |
| Modifier | Constructor and Description |
|---|---|
protected |
CopyOnWriteMap()
Deprecated.
since 0.0.12 use the versions that explicitly specify View.Type
|
protected |
CopyOnWriteMap(AbstractCopyOnWriteMap.View.Type viewType)
Create a new empty
CopyOnWriteMap. |
protected |
CopyOnWriteMap(Map<? extends K,? extends V> map)
Deprecated.
since 0.0.12 use the versions that explicitly specify View.Type
|
protected |
CopyOnWriteMap(Map<? extends K,? extends V> map,
AbstractCopyOnWriteMap.View.Type viewType)
Create a new
CopyOnWriteMap with the
supplied Map to initialize the values. |
| Modifier and Type | Method and Description |
|---|---|
static <K,V> CopyOnWriteMap.Builder<K,V> |
builder()
Get a
CopyOnWriteMap.Builder for a
CopyOnWriteMap instance. |
void |
clear()
Return a new copy containing no elements
|
boolean |
containsKey(Object key) |
boolean |
containsValue(Object value) |
protected M |
copy()
Create a copy of the underlying map.
|
protected abstract <N extends Map<? extends K,? extends V>> |
copy(N map)
Copy function, implemented by sub-classes.
|
Set<Map.Entry<K,V>> |
entrySet() |
boolean |
equals(Object o) |
V |
get(Object key) |
protected M |
getDelegate()
Return the internal delegate map.
|
int |
hashCode() |
boolean |
isEmpty() |
Set<K> |
keySet() |
static <K,V> CopyOnWriteMap<K,V> |
newHashMap()
Creates a new
CopyOnWriteMap with an
underlying HashMap. |
static <K,V> CopyOnWriteMap<K,V> |
newHashMap(Map<? extends K,? extends V> map)
Creates a new
CopyOnWriteMap with an
underlying HashMap using the supplied map as the initial
values. |
static <K,V> CopyOnWriteMap<K,V> |
newLinkedMap()
Creates a new
CopyOnWriteMap with an
underlying LinkedHashMap. |
static <K,V> CopyOnWriteMap<K,V> |
newLinkedMap(Map<? extends K,? extends V> map)
Creates a new
CopyOnWriteMap with an
underlying LinkedHashMap using the supplied map as the
initial values. |
V |
put(K key,
V value)
Add this key and its value to the map
|
void |
putAll(Map<? extends K,? extends V> t) |
V |
putIfAbsent(K key,
V value)
If the key is not currently contained in the map add it.
|
V |
remove(Object key) |
boolean |
remove(Object key,
Object value) |
V |
replace(K key,
V value)
Replace the value of the key if the key is present returning the value.
|
boolean |
replace(K key,
V oldValue,
V newValue)
Attempt to replace the value of the key with newValues so long as the key
is still associated with old value
|
protected void |
set(M map)
Set the contained map
|
int |
size() |
String |
toString() |
Collection<V> |
values() |
clone, finalize, getClass, notify, notifyAll, wait, wait, waitcompute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, replaceAll@Deprecated protected CopyOnWriteMap(Map<? extends K,? extends V> map)
CopyOnWriteMap with the
supplied Map to initialize the values.map - the initial map to initialize with@Deprecated protected CopyOnWriteMap()
CopyOnWriteMap.protected CopyOnWriteMap(Map<? extends K,? extends V> map, AbstractCopyOnWriteMap.View.Type viewType)
CopyOnWriteMap with the
supplied Map to initialize the values. This map may be
optionally modified using any of the key, entry or value viewsmap - the initial map to initialize withviewType - a View.Type.protected CopyOnWriteMap(AbstractCopyOnWriteMap.View.Type viewType)
CopyOnWriteMap.
This map may be optionally modified using any of the key, entry or value
viewsviewType - a View.Type.public static <K,V> CopyOnWriteMap.Builder<K,V> builder()
CopyOnWriteMap.Builder for a
CopyOnWriteMap instance.K - key typeV - value typepublic static <K,V> CopyOnWriteMap<K,V> newHashMap()
CopyOnWriteMap.public static <K,V> CopyOnWriteMap<K,V> newHashMap(Map<? extends K,? extends V> map)
CopyOnWriteMap with an
underlying HashMap using the supplied map as the initial
values.
This map has stable views.
map - a Map object.CopyOnWriteMap.public static <K,V> CopyOnWriteMap<K,V> newLinkedMap()
CopyOnWriteMap with an
underlying LinkedHashMap. Iterators for this map will be
return elements in insertion order.
This map has stable views.
CopyOnWriteMap.public static <K,V> CopyOnWriteMap<K,V> newLinkedMap(Map<? extends K,? extends V> map)
CopyOnWriteMap with an
underlying LinkedHashMap using the supplied map as the
initial values. Iterators for this map will be return elements in insertion
order.
This map has stable views.
map - a Map object.CopyOnWriteMap.protected abstract <N extends Map<? extends K,? extends V>> Map<K,V> copy(N map)
N - the map to copy and return.map - the initial values of the newly created map.public final void clear()
public final boolean remove(Object key, Object value)
remove in interface ConcurrentMap<K,V>remove in interface Map<K,V>public final boolean replace(K key,
V oldValue,
V newValue)
replace in interface ConcurrentMap<K,V>replace in interface Map<K,V>key - a K key to to define a new association for.oldValue - if this value is still present replace it with newValue.newValue - a V to add to the map.public final V replace(K key,
V value)
replace in interface ConcurrentMap<K,V>replace in interface Map<K,V>key - a K key.value - a V value.public final V put(K key,
V value)
public final V putIfAbsent(K key,
V value)
putIfAbsent in interface ConcurrentMap<K,V>putIfAbsent in interface Map<K,V>key - a K key.value - a V value.public final void putAll(Map<? extends K,? extends V> t)
protected M copy()
protected final void set(M map)
map - a M contained by this class.public final Collection<V> values()
public final boolean containsKey(Object key)
containsKey in interface Map<K,V>public final boolean containsValue(Object value)
containsValue in interface Map<K,V>public final boolean equals(Object o)
public final int hashCode()
protected final M getDelegate()
Copyright © 2016 Atlassian. All rights reserved.