Z Javadoc wiem, że ConcurrentHashMap.replace
jest atomowe, ale co z ConcurrentHashMap.put
? Widzę, że są one różnie implementowane w kodzie źródłowym, ale nie jestem w stanie rozróżnić ich różnic. Każdy guru, który przedstawi wskazówki dotyczące korzystania z tych dwóch metod?ConcurrentHashMap.put V.S. ConcurrentHashMap.replace
Odpowiedz
Są funkcjonalnie różne. replace
zapisuje tylko parę klucz-wartość, jeśli wcześniej została zapisana wartość pod określonym kluczem. Dokumentacja interfejsu API podana w dokumencie wyjaśnia:
Zastępuje wpis dla klucza tylko wtedy, gdy jest aktualnie odwzorowany na pewną wartość. Jest to równoważne z wartością
if (map.containsKey(key)) { return map.put(key, value); } else return null;
z tą różnicą, że akcja jest wykonywana atomowo.
put()
jest dziedziczona z klasy AbstractMap
, która rozciąga się na ConcurrentHashMap
. Nie ma konkretnej umowy współbieżności na put()
. Dziedziczenie to pozwala na użycie ConcurrentHashMap
w "tradycyjnym" kontekście mapy. Ale żadna metoda AbstractMap
nie jest atomowa.
replace()
jest zaimplementowany zgodnie z żądaniem interfejsu ConcurrentMap
. Ten interfejs wymaga operacji atomowych, takich jak replace()
. W kodzie zgodnym z interakcją powinny być używane tylko metody tego interfejsu.
Aby wykonać operację atomową put()
, należy użyć putIfAbsent()
pochodzącej z tego samego interfejsu ConcurrentMap
.
Patrząc na kod umieścić w ConcurrentHashMap, realizacja ma zachowanie atomowej dodaje się do niej, a docs Java powiedzieć:
Blockquote Klasa ta wypełnia tę samą specyfikację funkcjonalną jak Hashtable i obejmuje wersje metod odpowiadającej każdej metodzie Hashtable.
Jak rozumiem, powinno być bezpiecznie używać metody put w ConcurrentHashMap.
+1 I obie operacje są atomowe. –
Powinienem uważniej przeczytać Javadoc ... Dziękujemy! –