
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:
- Usar ConcurrentHashMap (Que já aprendemos a utilizar no post anterior)
- 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á. 🙂
Leave a Reply