Jaka jest różnica między ConcurrentHashMap i Hashtable w Javie?ConcurrentHashMap i Hashtable w Javie
Co jest bardziej wydajne w aplikacjach z gwintem?
Jaka jest różnica między ConcurrentHashMap i Hashtable w Javie?ConcurrentHashMap i Hashtable w Javie
Co jest bardziej wydajne w aplikacjach z gwintem?
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.
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. –
@FrankPavageau dodał twoje bardzo przydatne komentarze w oryginalnej odpowiedzi. – Algorithmist
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)
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.
Może to pomóc http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-i-just-as-good-hashmap.html – kosa
Dla niewątkowanych aplikacji, użyj 'HashMap'. –
Zobacz także http://stackoverflow.com/a/40878/632951, aby uzyskać więcej informacji. – Pacerier