6

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

11

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.

+5

+1 I obie operacje są atomowe. –

+0

Powinienem uważniej przeczytać Javadoc ... Dziękujemy! –

2

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.

0

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.