HashMap pode ser sincronizado em Java?

HashMap é uma estrutura de dados muito poderosa em Java e nós a usamos todos os dias e em quase todos os aplicativos.

Como devem saber HashMap é uma classe de coleção não sincronizada, caso não saibam, a novidade é saber que SIM, HashMap pode ser sincronizado.

Neste tutorial, vamos tentar entender “Por Quê” e “Como” podemos sincronizar o Hashmap!

Por quê?

O Map é uma estrutura de dados que armazena elementos, formado por uma combinação de uma chave de identificação exclusiva e um valor atribuído mapeado. Se você tiver uma aplicação altamente concorrente no qual deseja modificar ou ler o valor da chave em diferentes threads, digo-te logo que o ideal usar a implementação ConcurrentHashMap. O melhor exemplo é o Producer/Consumer, que faz com leitura/gravação concorrente.

Então, o que significa o Map ser thread-safe?

Significa que se vários encadeamentos acessam um HashMap em concorrência e pelo menos um dos encadeamentos modifica o Map estruturalmente, ele deve ser sincronizado externamente para evitar uma visualização inconsistente do conteúdo. Tão isso quanto isso.

Como?

Vamos lá! Existem duas maneiras de sincronizar o HashMap:
  1. Usar ConcurrentHashMap (Que já aprendemos a utilizar no post anterior)
  2. Java Collections – método synchronizedMap()
//synchronizedMap
Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());

SynchronizedHashMap

  • Sincronização a nível do objeto.
  • Cada operação de leitura/gravação precisa adquirir lock.
  • Fazer lock a coleção inteira é uma sobrecarga de desempenho.
  • Essencialmente dá acesso a apenas uma thread para todo o Map e bloqueia todos as outras threads.
  • Pode causar contenção.
  • SynchronizedHashMap retorna um Iterator, que falha rapidamente se utilizado em concorrêcia.

No próximo post pretendo então exemplificar, explicar e fazer um benchmark entre SynchronizedHashMap e ConcurrentHashMap.

Obrigado e até lá. 🙂

Published by Ivan Marrêta

Software Engineer

2 thoughts on “HashMap pode ser sincronizado em Java?

Leave a 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 )

Google photo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

%d bloggers like this: