Java 8:
Ora il ConcurrentHashMap
non utilizza uno schema striatura blocco fisso affatto, invece ciascun segmento funge da “banda” utilizzando la sincronizzazione intrinseca.
Codice da fonte:
/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
...
Node<K,V> f; int n, i, fh;
...
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
...
synchronized (f) {
...
}
}
e il costruttore ha il parametro appena usarlo come un suggerimento dimensioni come dicono i documenti.
concurrencyLevel: il numero stimato di thread di aggiornamento simultanei. L'implementazione può utilizzare questo valore come suggerimento per il dimensionamento.
E la fonte:
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
throw new IllegalArgumentException();
if (initialCapacity < concurrencyLevel) // Use at least as many bins
initialCapacity = concurrencyLevel; // as estimated threads
long size = (long)(1.0 + (long)initialCapacity/loadFactor);
int cap = (size >= (long)MAXIMUM_CAPACITY) ?
MAXIMUM_CAPACITY : tableSizeFor((int)size);
this.sizeCtl = cap;
}
Quindi non c'è bisogno di prendere in considerazione da soli, ConcurrentHashMap
gestirà per voi.
Sapete quanti thread possono accedere contemporaneamente alla mappa? – rolve
dipende dal numero di utente attualmente connesso al sistema. – csk