2009-08-18 10 views

Odpowiedz

64

synchroniczny HashMap:

  1. Każdy sposób jest zsynchronizowane za pomocą zamka poziomów obiektu. Tak więc metody get i put na synchMap zyskują blokadę.

  2. Zablokowanie całej kolekcji jest obciążeniem wydajności. Podczas gdy jeden wątek utrzymuje się na zamku, żaden inny wątek nie może korzystać z kolekcji.

ConcurrentHashMap został wprowadzony w JDK 5.

  1. Nie ma zamek na poziomie obiektu, zamek jest w znacznie drobniejszej ziarnistości. W przypadku ConcurrentHashMap zamki mogą znajdować się na poziomie kubła koszącego.

  2. Efektem blokowania niższego poziomu jest możliwość jednoczesnego korzystania z czytników i programów piszących, co nie jest możliwe w przypadku zsynchronizowanych kolekcji. To prowadzi do znacznie większej skalowalności.

  3. ConcurrentHashMap nie rzuca ConcurrentModificationException, jeśli jeden wątek próbuje go zmodyfikować, podczas gdy inny wykonuje iterację.

Ten artykuł Java 7: HashMap vs ConcurrentHashMap to bardzo dobra lektura. Wysoce polecany.

+3

Czym różni się "Hashtable" od "Synchronized HashMap"? – roottraveller

+0

Pomiędzy ConcurrentHashMap i Synchronized HashMap, którą polecacie? – Blunderchips

76

Krótka odpowiedź:

Obie mapy są implementacje bezpieczny wątku interfejsu Map. ConcurrentHashMap jest zaimplementowany dla większej przepustowości w przypadkach, w których oczekuje się wysokiej współbieżności.

Brian Goetz's article w sprawie idei ConcurrentHashMap jest bardzo dobrą lekturą. Wysoce polecany.

+0

Co to jest? HashMap: Zauważ, że ta realizacja nie jest zsynchronizowany aby zapobiec przypadkowemu niezsynchronizowane dostęp do mapy: 'Mapa m = Collections.synchronizedMap (new HashMap (...));' http: // docs. oracle.com/javase/7/docs/api/java/util/HashMap.html – karate

+3

"Artykuł Briana Goetza ... to bardzo dobra lektura." - A jeszcze bardziej jest to jego książka "Java Concurrency in Practice". –

24

ConcurrentHashMap jest bezpieczny w użyciu bez synchronizacji całej mapy. Czytanie może się zdarzyć bardzo szybko, gdy zapis odbywa się za pomocą blokady.

5

ConcurrentHashMap wykorzystuje drobnoziarnisty mechanizm blokujący znany jako lock stripping, aby umożliwić większy stopień współdzielonego dostępu. Dzięki temu zapewnia lepszą skalowalność współbieżności i skalowalności.

także iteratory wrócił do ConcurrentHashMapsłabo zgodny zamiast zawieść szybką technikę używany przez Synchronized HashMap.

2

Metody na SynchronizedMap przytrzymaj blokadę obiektu, natomiast w ConcurrentHashMap istnieje koncepcja "blokowania zamków", w której zamiast zamków trzymane są pojemniki z zawartością. W ten sposób poprawiona skalowalność i wydajność.

1

ConcurrentHashMap:

1) Obie mapy są implementacje bezpieczny wątku interfejsu mapy.

2) Aplikacja ConcurrentHashMap została zastosowana w celu uzyskania wyższej przepustowości w przypadkach, w których oczekiwana jest wysoka współbieżność.

3) Nie ma blokady na poziomie obiektu.

synchroniczne Hash Mapa:

1) Każda metoda jest synchronizowana za pomocą zamka poziomów obiektu.

7

Obie są zsynchronizowaną wersją HashMap, z różnicą w ich podstawowej funkcjonalności i wewnętrznej strukturze.

ConcurrentHashMap składa się z wewnętrznych segmentów, które można konceptualnie postrzegać jako niezależne HashMaps. Wszystkie takie segmenty mogą być blokowane przez osobne wątki przy dużych równoczesnych wykonaniach. Tak więc wiele wątków może uzyskiwać/ustawiać pary klucz-wartość z ConcurrentHashMap bez blokowania/oczekiwania na siebie. Zostało to wprowadzone dla większej przepustowości.

natomiast

Collections.synchronizedMap(), mamy zsynchronizowaną wersję HashMap i jest dostępny w blokowaniu sposób. Oznacza to, że jeśli wiele wątków spróbuje uzyskać dostęp do zsynchronizowanej mapy jednocześnie, będą one miały możliwość pobierania/umieszczania par klucz-wartość po jednej na raz w zsynchronizowany sposób.

5

Możemy osiągnąć bezpieczeństwo wątku za pomocą zarówno ConcurrentHashMap, jak i synchronizedHashmap. Ale jest duża różnica, jeśli spojrzeć na ich architekturę.

  1. synchronisedHashmap

To będzie utrzymywać blokadę na poziomie obiektu. Więc jeśli chcesz wykonać jakąkolwiek operację, taką jak put/get, musisz najpierw zdobyć blokadę. W tym samym czasie inne wątki nie mogą wykonywać żadnej operacji. Tak więc w danym momencie może działać tylko jeden wątek. Czas oczekiwania wzrośnie tutaj. Można powiedzieć, że wydajność jest stosunkowo niska w porównaniu z ConcurrentHashMap.

  1. ConcurrentHashMap

Będzie utrzymać blokadę na poziomie segmentu. Ma 16 segmentów i domyślnie utrzymuje poziom współbieżności równy 16. Tak więc jednocześnie 16 wątków może działać na ConcurrentHashMap. Co więcej, operacja odczytu nie wymaga blokady. Tak więc dowolna liczba wątków może wykonać operację pobierania.

Jeśli wątek1 chce wykonać operację wstawiania w segmencie 2, a wątek2 chce wykonać operację wstawiania w segmencie 4, jest to tutaj dozwolone. Znaczy, 16 wątków może wykonywać aktualizację (wstawić/usunąć) operację na ConcurrentHashMap na raz.

Dzięki temu czas oczekiwania będzie mniejszy. W związku z tym wydajność jest stosunkowo lepsza niż synchronizedHashmap.

0

ConcurrentHashMap umożliwia jednoczesny dostęp do danych. Cała mapa jest podzielona na segmenty.

Operacja odczytu tj. get(Object key) nie jest zsynchronizowany nawet na poziomie segmentu.

Ale operacje zapisu, tj. remove(Object key), get(Object key) pozyskaj blokadę na poziomie segmentu. Tylko część całej mapy jest zablokowana, inne wątki nadal mogą odczytać wartości z różnych segmentów oprócz zablokowanego.

SynchronizedMap z drugiej strony, nabywają blokadę na poziomie obiektu. Wszystkie wątki powinny czekać na bieżący wątek niezależnie od operacji (odczyt/zapis).