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. Bootstrap-sass Gem v.s. CDN
- 2. Czas liniowy v.s. Kwadratowy czas
- 3. GPS V.S. akcelerometr do obliczania odległości
- 4. spróbuj zrozumieć pojęcia mysql: session v.s. połączenie
- 5. elasticsearch v.s. MongoDB do aplikacji filtrującej
- 6. WCF v.s. Legacy ASP.Net Web Services
- 7. python "import datetime" v.s. „Z datetime import datetime”
- 8. Javascript: setAttribute() v.s. element.attribute = wartość ustawić „name” Atrybut
- 9. wielkość pamięci struktury danych Pythona
- 10. Rozróżnić między iPhone czarno-białych?
- 11. Wyłącz klawiaturę <enter> klucz
- 12. Eksportowanie funkcji z anonimową strukturą jako parametrem [nie można użyć wartości (typ struct {...}) jako typu struct {...} w argumencie package.Func]
+1 I obie operacje są atomowe. –
Powinienem uważniej przeczytać Javadoc ... Dziękujemy! –