HashMap vs. ConcurrentHashMap vs. SynchronizedMap – Cum poate fi sincronizat un HashMap în Java

Publicat: 2015-01-29

Crunchify ConcurrentHashMap vs. Exemplu de hartă sincronizată HashMap este o structură de date foarte puternică în Java. Îl folosim zilnic și aproape în toate aplicațiile. Există destul de multe exemple pe care le-am scris înainte despre Cum să implementez cacheul Threadsafe, Cum să convertesc Hashmap în Arraylist?

Am folosit Hashmap în ambele exemple de mai sus, dar acestea sunt cazuri de utilizare destul de simple ale Hashmap. HashMap is a non-synchronized .

Aveți vreo întrebare de mai jos?

  • Care este diferența dintre ConcurrentHashMap și Collections.synchronizedMap(Map)?
  • Care este diferența dintre ConcurrentHashMap și Collections.synchronizedMap(Map) în ceea ce privește performanța?
  • ConcurrentHashMap vs Collections.synchronizedMap()
  • Întrebări populare de interviu HashMap și ConcurrentHashMap

În acest tutorial vom trece peste toate interogările de mai sus și vom explica why and how am putea sincroniza Hashmap?

De ce?

Obiectul Map este un container asociativ care stochează elemente, format dintr-o combinație între o key de identificare unică și o value mapată. Dacă aveți o aplicație foarte concurentă în care doriți să modificați sau să citiți valoarea cheii în fire diferite, atunci este ideal să utilizați Concurrent Hashmap. Cel mai bun exemplu este Producer Consumer, care se ocupă de citirea/scrierea simultană.

Deci, ce înseamnă harta thread-safe? Dacă multiple threads accesează simultan o hartă hash și cel puțin unul dintre fire modifică structura structural, aceasta must be synchronized externally pentru a evita o vizualizare inconsistentă a conținutului.

Cum?

Există două moduri în care putem sincroniza HashMap

  1. Metoda Java Collections synchronizedMap().
  2. Utilizați ConcurrentHashMap

ConcurrentHashMap

  • Ar trebui să utilizați ConcurrentHashMap atunci când aveți nevoie de concurență foarte mare în proiectul dvs.
  • Este thread safe fără a sincroniza whole map .
  • Citirile se pot întâmpla foarte repede în timp ce scrierea se face cu o blocare.
  • Nu există blocare la nivel de obiect.
  • Blocarea este la o granularitate mult mai fină la nivel de găleată hashmap.
  • ConcurrentHashMap nu lansează o ConcurrentModificationException dacă un fir încearcă să-l modifice în timp ce altul repetă peste el.
  • ConcurrentHashMap folosește o multitudine de blocări.

SynchronizedHashMap

  • Sincronizare la nivel de obiect.
  • Fiecare operație de citire/scriere trebuie să obțină blocare.
  • Blocarea întregii colecții este o suprasolicitare a performanței.
  • Acest lucru oferă, în esență, acces la un singur fir la întreaga hartă și blochează toate celelalte fire.
  • Poate provoca dispute.
  • SynchronizedHashMap returnează Iterator , care eșuează rapid la modificarea concomitentă.

Acum să aruncăm o privire la cod

  1. Creați clasa CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. Creați obiect pentru fiecare HashTable, SynchronizedMap și CrunchifyConcurrentHashMap
  3. Adăugați și preluați 500.000 de intrări de pe Hartă
  4. Măsurați ora de început și de sfârșit și timpul de afișare în milisecunde
  5. Vom folosi ExecutorService pentru a rula 5 threads în paralel

Iată un cod Java:

  • shutdown() înseamnă că serviciul executor nu mai preia sarcinile primite.
  • awaitTermination() este invocat după o solicitare de oprire.

Și, prin urmare, trebuie să închideți mai întâi serviceExecutor și apoi să blocați și să așteptați ca firele să se termine.

Rezultat consola Eclipse: