ConcurrentHashMap

ConcurrentHashMap é uma melhoria do HashMap, pois sabemos que, ao lidar com Threads, o HashMap não é uma boa escolha porque o em termos de desempenho deixa muito a desejar.

A classe ConcurrentHashMap é thread-safe, ou seja, várias threads podem operar em um único objeto sem complicações. Ao mesmo tempo, qualquer número de encadeamentos é aplicável para uma operação de leitura sem bloquear o objeto ConcurrentHashMap que não existe no HashMap.

A estrutura de dados que o ConcurrentHashMap utiliza é a HashTable.

No ConcurrentHashMap, o objeto é dividido em vários segmentos de acordo com o concurrency-level, e como default o concurrency-level do ConcurrentHashMap é 16.


No ConcurrentHashMap, a qualquer momento mais que uma thread pode executar operação de recuperação de valor, só que para fazer update no objeto, a thread deve bloquear esse segmento específico que a thread deseja operar. Este tipo de mecanismo de bloqueio é conhecido como Segment locking or bucket locking. Consequentemente, 16 operações de update podem ser realizadas por threads.

A inserção de objetos nulos não é possível em ConcurrentHashMap como chave ou valor. Diferentemente da implementação mais utilizada, a HashMap.

public class ConcurrentHashMap<K,​V> extends AbstractMap<K,​V> implements ConcurrentMap<K,​V>, Serializable

Onde K é a chave do objeto e V é o valor do objeto.

Inicializando um ConcurrentHashMap

Podemos utilizar um dos 5 contrutores para isso:

//Cria um novo map vazio com valores default: initial capacity (16), load factor (0.75) e concurrencyLevel (16).
new ConcurrentHashMap<>();

//Cria um novo map vazio com: initial capacity que foi definida, e com default load factor (0.75) e concurrencyLevel (16).
new ConcurrentHashMap<>(int initialCapacity);

//Cria um novo map vazio com: initial capacity e load factor que foram definidos, e com concurrencyLevel default (16).
new ConcurrentHashMap<>(int initialCapacity, float loadFactor);

//Cria um novo map vazio com: initial capacity, load factor e concurrencyLevel que foram definidos.
new ConcurrentHashMap<>(int initialCapacity, float loadFactor, int concurrencyLevel);

//Cria um novo map com os mesmos atributos do map passado como parâmetro.
new ConcurrentHashMap<>(Map m);

Por quê?

Quando precisar de alta simultaneidade em seu projeto.

É thread-safe sem sincronizar todo o mapa. (apenas os segmentos, lembram?)

As leituras podem acontecer muito rapidamente enquanto a gravação é feita com um bloqueio.

Não há bloqueio no nível do objeto.

O bloqueio tem uma granularidade muito mais fina no nível do depósito de hashmap.

Não lança uma ConcurrentModificationException se uma thread tenta modificá-lo enquanto outra está iterando sobre ele.

ConcurrentHashMap usa uma infinidade de bloqueios.


🙂

Leave a Reply to Thiago Ramos (@thramosal) Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Comments (

3

)

  1. HashMap pode ser sincronizado em Java? – IVAN MARRÊTA

    […] Usar ConcurrentHashMap (Que já aprendemos a utilizar no post anterior) […]

    Like

  2. SynchronizedMap x ConcurrentHashMap – micro benchmark – IVAN MARRÊTA

    […] conversamos sobre SynchronizedMap e ConcurrentHashMap, os resultados obtidos refletem a forma de acesso aos objetos […]

    Like

  3. Thiago Ramos (@thramosal)

    Irado, nunca usei ConcurrentHashMap. Bom saber que ele pode ser lido de forma thread-safe.

    Like

Create a website or blog at WordPress.com

%d bloggers like this: