2012-09-28 6 views
41

Jaka jest różnica między ConcurrentHashMap i Hashtable w Javie?ConcurrentHashMap i Hashtable w Javie

Co jest bardziej wydajne w aplikacjach z gwintem?

+0

Może to pomóc http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-i-just-as-good-hashmap.html – kosa

+2

Dla niewątkowanych aplikacji, użyj 'HashMap'. –

+0

Zobacz także http://stackoverflow.com/a/40878/632951, aby uzyskać więcej informacji. – Pacerier

Odpowiedz

68

ConcurrentHashMap wykorzystuje wiele wiader do przechowywania danych. Pozwala to uniknąć blokad odczytu i znacznie poprawia wydajność w stosunku do HashTable. Oba są bezpieczne dla wątków, ale są oczywiste wygrane wydajności z ConcurrentHashMap.

Podczas czytania z ConcurrentHashMap przy użyciu get(), nie ma blokad, w przeciwieństwie do HashTable, dla której wszystkie operacje są po prostu zsynchronizowane. HashTable został wydany w starszych wersjach Java, podczas gdy ConcurrentHashMap jest rzeczą w języku Java 5+.

HashMap to najlepsza rzecz do zastosowania w aplikacji z pojedynczym gwintem.

+10

Istnieje również 'ConcurrentHashMap.putIfAbsent()', który nie ma odpowiednika w starym ' Hashtable'. A gdy czytasz tylko z 'ConcurrentHashMap', nie ma żadnych zamków, w przeciwieństwie do' HashTable', dla której wszystkie operacje są po prostu zsynchronizowane. –

+0

@FrankPavageau dodał twoje bardzo przydatne komentarze w oryginalnej odpowiedzi. – Algorithmist

53

ConcurrentHashMap i Hashtable mechanizm blokujący

  • Hashtable jest należący do ram gromadzenia; ConcurrentHashMap należy do frameworka Executora.
  • Hashtable używa pojedynczego zamka dla pełnych danych. ConcurrentHashMap używa wielu zamków na poziomie segmentu (domyślnie 16) zamiast poziomu obiektu, tj. Całego Map.
  • ConcurrentHashMap blokowanie dotyczy tylko aktualizacji. W przypadku wyszukiwań umożliwia pełną współbieżność, a retrieje odzwierciedlają wyniki ostatnio ukończonych operacji aktualizacji. Czytanie może się zdarzyć bardzo szybko, podczas gdy zapisywanie odbywa się za pomocą zamka.
  • ConcurrentHashMap nie rzuca ConcurrentModificationException, jeśli jeden wątek próbuje go zmodyfikować, podczas gdy inny wykonuje iterację i nie dopuszcza wartości pustych.
  • ConcurrentHashMap zwraca Iterator, który nie jest bezpieczny (tj. Iterator tworzy kopię wewnętrznej struktury danych) na równoczesnej modyfikacji.
  • ConcurrentHashMap wykorzystuje logikę odłamki Database (Segment<K, V>[] segments) jest znany jako Współbieżnym poziomie, czyli dzieli dane na kawałki (segmentów), niż stawia zamki na każdym fragmencie (segment) zamiast umieszczać pojedyncze blokady dla całych danych (Map). Wartość domyślna to 16.

Aby zrozumieć ConcurrentHashMap bardziej technicznie proszę spojrzeć na ten link

Poniższa analogia pomaga uzyskać tylko zrozumieć pojęcie (nie logicznej)

  • Przyjmijmy Hashtable i ConcurrentHashMap to dwa rodzaje domów.
  • Hashtable blokuje główne drzwi domu.
  • ConcurrentHashMap blokuje określone drzwi pokoju zamiast głównych drzwi.

Co jest bardziej wydajne w aplikacjach z gwintem?

ConcurrentHashMap jest bardziej wydajny w przypadku aplikacji gwintowanych.

+0

Świetna odpowiedź + Peter – prayagupd

+0

Bardzo dobrze wyjaśniony – RamBen

+2

Domowy przykład zwyciężył nad całą teorią :) –