Jaka jest różnica między używaniem klasy opakowania, SynchronizedMap
, na HashMap
i ConcurrentHashMap
? Czy po prostu można zmodyfikować HashMap
podczas iterowania go (ConcurrentHashMap
)?ConcurrentHashMap vs Synchronized HashMap
Odpowiedz
synchroniczny HashMap
:
Każdy sposób jest zsynchronizowane za pomocą zamka poziomów obiektu. Tak więc metody get i put na synchMap zyskują blokadę.
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.
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.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.
ConcurrentHashMap
nie rzucaConcurrentModificationException
, 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.
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.
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
"Artykuł Briana Goetza ... to bardzo dobra lektura." - A jeszcze bardziej jest to jego książka "Java Concurrency in Practice". –
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.
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 ConcurrentHashMap
są słabo zgodny zamiast zawieść szybką technikę używany przez Synchronized HashMap.
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ść.
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.
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.
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ę.
- 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.
- 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.
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).
- 1. AtomicInteger vs synchronized getters/setters
- 2. @synchronized vs. NSLock Instance vs. pthread_mutex_t
- 3. wielowątkowe użycie `iteratorów ConcurrentHashMap`
- 4. Klasa Object vs HashMap
- 5. ConcurrentHashMap vs ReentrantReadWriteLock opartej własną mapę do przeładunku
- 6. LinkedHashMap vs HashMap! = LinkedList vs ArrayList
- 7. Java ustalony przełącznik vs HashMap
- 8. JVM Synchronized Finally Blocks
- 9. Filtr ConcurrentHashMap według wartości
- 10. Czy plik ConcurrentHashMap musi być zawinięty w zsynchronizowany blok?
- 11. Kolekcja NSMutableArray i @Synchronized blocks
- 12. Java Synchronized Block for .class
- 13. współbieżna HashMap: sprawdzanie rozmiaru
- 14. HashMap w HashMap
- 15. ConcurrentHashMap Czytanie i zapisywanie blokad
- 16. ConcurrentHashMap i Hashtable w Javie
- 17. Jaka jest różnica w korzystaniu z ReentrentLock i Synchronized (object)?
- 18. Wyszukaj HashMap w ArrayList of HashMap
- 19. ConcurrentHashMap i Fibonacciego Liczby - Niezgodne wynik
- 20. deduplikacji dla String metody intern w ConcurrentHashMap
- 21. Scala Mapa i ConcurrentHashMap rzucać java.lang.UnsupportedOperationException
- 22. Wdrażanie HashMap
- 23. Sprawdź, czy obiekt jest instancją String, HashMap lub HashMap []
- 24. JAXB HashMap unmappable
- 25. Aktualizacja Java HashMap klucz
- 26. HashMap Java 8 realizacja
- 27. HashMap wykorzystuje LinkedList wewnętrznie
- 28. mylić o hashmap # resize
- 29. Jak utworzyć literał HashMap?
- 30. Android HashMap w pakiecie?
Czym różni się "Hashtable" od "Synchronized HashMap"? – roottraveller
Pomiędzy ConcurrentHashMap i Synchronized HashMap, którą polecacie? – Blunderchips