HashMap vs. HashMap simultanei vs. SynchronizedMap – Come sincronizzare una HashMap in Java

Pubblicato: 2015-01-29

Crunchify ConcurrentHashMap vs. Esempio di mappa sincronizzata HashMap è una struttura dati molto potente in Java. Lo usiamo tutti i giorni e quasi in tutte le applicazioni. Ci sono alcuni esempi che ho scritto prima su Come implementare la cache Threadsafe, Come convertire Hashmap in Arraylist?

Abbiamo usato Hashmap in entrambi gli esempi precedenti, ma quelli sono casi d'uso piuttosto semplici di Hashmap. HashMap is a non-synchronized .

Hai una delle seguenti domande?

  • Qual è la differenza tra ConcurrentHashMap e Collections.synchronizedMap(Map)?
  • Qual è la differenza tra ConcurrentHashMap e Collections.synchronizedMap(Map) in termini di prestazioni?
  • ConcurrentHashMap vs Collections.synchronizedMap()
  • Domande popolari dell'intervista su HashMap e ConcurrentHashMap

In questo tutorial esamineremo tutte le domande di cui sopra e il motivo why and how potremmo sincronizzare Hashmap?

Come mai?

L'oggetto Mappa è un contenitore associativo che memorizza elementi, formato da una combinazione di una key di identificazione univoca e un value mappato. Se disponi di un'applicazione molto simultanea in cui potresti voler modificare o leggere il valore della chiave in thread diversi, è l'ideale utilizzare Hashmap simultaneo. Il miglior esempio è Producer Consumer che gestisce la lettura/scrittura simultanea.

Quindi cosa significa la mappa thread-safe? Se multiple threads accedono a una mappa hash contemporaneamente e almeno uno dei thread modifica strutturalmente la mappa, must be synchronized externally per evitare una visualizzazione incoerente dei contenuti.

Come?

Ci sono due modi per sincronizzare HashMap

  1. Raccolte Java metodo sincronizzatoMap()
  2. Usa ConcurrentHashMap

HashMap simultaneo

  • Dovresti usare ConcurrentHashMap quando hai bisogno di una concorrenza molto alta nel tuo progetto.
  • È thread-safe senza sincronizzare l' whole map .
  • Le letture possono avvenire molto velocemente mentre la scrittura viene eseguita con un blocco.
  • Non vi è alcun blocco a livello di oggetto.
  • Il blocco ha una granularità molto più fine a livello di bucket hashmap.
  • ConcurrentHashMap non genera ConcurrentModificationException se un thread tenta di modificarlo mentre un altro sta iterando su di esso.
  • ConcurrentHashMap utilizza una moltitudine di blocchi.

Sincronizzato HashMap

  • Sincronizzazione a livello di oggetto.
  • Ogni operazione di lettura/scrittura deve acquisire il blocco.
  • Il blocco dell'intera raccolta è un sovraccarico di prestazioni.
  • Questo essenzialmente dà accesso a un solo thread all'intera mappa e blocca tutti gli altri thread.
  • Potrebbe causare contese.
  • SynchronizedHashMap restituisce Iterator , che fallisce rapidamente in caso di modifiche simultanee.

Ora diamo un'occhiata al codice

  1. Crea classe CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. Crea un oggetto per ogni HashTable, SynchronizedMap e CrunchifyConcurrentHashMap
  3. Aggiungi e recupera 500.000 voci dalla mappa
  4. Misura l'ora di inizio e di fine e visualizza il tempo in millisecondi
  5. Useremo ExecutorService per eseguire 5 threads in parallelo

Ecco un codice Java:

  • shutdown() significa che il servizio executor non richiede più attività in arrivo.
  • awaitTermination() viene richiamato dopo una richiesta di arresto.

E quindi, devi prima arrestare serviceExecutor e quindi bloccare e attendere che i thread finiscano.

Risultato console Eclipse: