Nie, tracą korzyści ConcurrentHashMap
robiąc to. można używasz, jak również do HashMap
z synchronized
lub synchronizedMap()
aby zablokować całą tabelę (czyli co zrobić, gdy owijanie operacje w synchronized
, ponieważ monitor implikowana jest cała instancja obiektu.)
Celem ConcurrentHashMap
jest Zwiększ przepustowość współbieżnego kodu, zezwalając na jednoczesne odczytywanie/zapisywanie na stole bez blokowania całej tabeli. Tablica obsługuje to wewnętrznie za pomocą listwy blokującej (wiele blokad zamiast jednego, z każdą blokadą przypisaną do zestawu haków mieszających - patrz Java Concurrency in Practice autorstwa Goetza i innych).
Gdy używasz ConcurrentHashMap
, wszystkie standardowe metody map (put()
, remove()
, itp.) Stają się atomowe dzięki zastosowaniu paska zamka itp. W implementacji. Jedynymi komplikacjami są to, że metody takie jak size()
i isEmpty()
niekoniecznie muszą zwracać dokładne wyniki, ponieważ jedynym sposobem, w jaki mogą one być, dla wszystkich operacji jest zablokowanie całej tabeli.
Interfejs ConcurrentMap
interface dodaje również nowe operacje złożone atomowy jak putIfAbsent()
(umieścić coś tylko wtedy, gdy klucz nie znajduje się już na mapie), remove()
przyjmowanie zarówno klucz i wartość (usunąć pozycję tylko wtedy, gdy jego wartość jest równa parametr przejechania) itp. Operacje te wymagały zablokowania całej tabeli, ponieważ wymagały dwóch wywołań metod (np. putIfAbsent()
wymagałyby wywołań zarówno containsKey()
, jak i put()
, zapakowanych wewnątrz jednego bloku synchronized
, jeśli używano standardowej implementacji Map
). ponownie, zyskujesz większą przepustowość za pomocą tych metod, unikając blokowania całej tabeli.