2011-12-14 14 views
8

Czy metoda ConcurrentHashMap.putAll (Map) ma być atomowa?Czy "ConcurrentHashMap.putAll (...)" jest atomowe?

Nie mogę znaleźć tego w dokumentacji i nie jest wspomniany w interfejsie ConcurrentMap, więc domyślam się, że odpowiedź brzmi "nie". Proszę o to, by była pewna, ponieważ nie miałoby sensu, gdyby ta operacja nie była uczciwa z punktu widzenia atomu.

Jeśli nie jest atomowy, jaki byłby najlepszy sposób na obsługę wkładów atomowych wielu przedmiotów? Powrót do starego dobrego zsynchronizowanego?

Odpowiedz

9

To nie jest atomowe, nie. Według the class documentation:

dla operacji zbiorczych, takich jak putAll i clear, jednoczesnych wyszukiwań może odzwierciedlać wstawienie lub usunięcie tylko niektórych wpisów.

Aby go atomizować, musisz użyć synchronized, tak. Nie można tego zrobić bez blokowania.

+0

Co z inną (niestandardową) współbieżną implementacją mapy? –

+0

@pst Który z kandydatów może być? –

+0

@ JaperD. Nie mam pojęcia. Zastanawiam się, czy miałeś jakiś wgląd, chociaż ta odpowiedź jest wciąż kompletna bez. –

3

na górze the doc

przypadku operacji kruszywo, takie jak putAll i clear, równoczesnego wyszukiwań może odzwierciedlać włożenie lub usunięcie tylko niektórych wpisów.

2

putAll() nie jest atomowa, lecz jedynie ma gwarancję, że każda jednostka put() jest atomowy.

2

Aby atomicize, będziesz musiał użyć zsynchronizowane, tak

Nie tylko, że: trzeba umieścić zsynchronizowany blok wokół każdej metody publicznej mapie zatem poniżającego współbieżności.

Powiązane problemy