Według docs ConcurrentHashMap Oracle
Konstruktor ConcurrentHashMap wygląda następująco:
publicznego ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
Zatem powyższa linia tworzy nowa, pusta mapa z określoną początkową pojemnością, współczynnikiem obciążenia i poziomem współbieżności. gdzie ważne parametry, które należy rozważyć z ConcurrentHashMap Konstruktor:
- initialCapacity - początkowa pojemność. Implementacja wykonuje wewnętrzny rozmiar, aby pomieścić tak wiele elementów.
- concurrencyLevel - szacowana liczba jednoczesnych aktualizacji wątków. Implementacja służy do wewnętrznego wymiarowania, aby spróbować uwzględnić wiele wątków.
W aplikacji ConcurrentHashMap Api znajdują się następujące stałe.
- statyczny końcowy int DEFAULT_INITIAL_CAPACITY = 16;
- statyczny końcowy int DEFAULT_CONCURRENCY_LEVEL = 16;
Parametry początkowego parametru wydajności i poziomu współbieżności konstruktora ConcurrentHashMap (lub obiektu) są domyślnie ustawione na 16.
W ten sposób, zamiast blokady szerokiej mapy, ConcurrentHashMap utrzymuje listę 16 blokad domyślnie (liczba blokad równa początkowej pojemności, która jest domyślnie 16), z których każda jest używana do blokowania pojedynczego zasobnika Mapa.Oznacza to, że 16 wątków (liczba wątków równa się poziomowi współbieżności, który jest domyślnie 16) może modyfikować kolekcję w tym samym czasie, biorąc pod uwagę, że każdy wątek działa na różnych zasobnikach. W odróżnieniu od hashtable, wykonujemy dowolną operację (aktualizację, usuwanie, czytanie, tworzenie) bez blokowania na całej mapie w aplikacji ConcurrentHashMap.
Operacje pobierania (w tym get) zasadniczo nie są blokowane. Używa w tym przypadku pojęcia niestabilności., więc może pokrywać się z operacjami aktualizacji (w tym wstawiania i usuwania). Retrievals odzwierciedlają wyniki ostatnio wykonanych operacji aktualizacji, które utrzymują się w momencie ich wystąpienia.
Dozwolona współbieżność między operacjami aktualizacji jest sterowana przez opcjonalny argument konstruktora ConcurrencyLevel (domyślnie 16), który jest używany jako wskazówka do wewnętrznego rozmiaru. Tabela jest wewnętrznie podzielona na partycje w celu umożliwienia wskazanej liczby równoczesnych aktualizacji bez rywalizacji. Ponieważ umieszczanie w tabelach mieszania jest zasadniczo losowe, faktyczna współbieżność będzie się różnić. Najlepiej jest wybrać wartość, aby pomieścić tyle wątków, ile kiedykolwiek jednocześnie modyfikuje tabelę. Używanie znacznie większej wartości niż potrzebna może zmarnować miejsce i czas, a znacznie mniejsza wartość może prowadzić do rywalizacji o wątki.
Mam nadzieję, że to pomoże!
hi..highlighted the questions –
Co masz na myśli między ConcurrentHashMap i ReadWriteLock? –