Czy metoda ConcurrentHashMap forEach jest bezpieczna wątkowo? [duplikować]
Jeśli chcesz wykonać iterację po wszystkich elementach w ConcurrentHashMap, czy użycie forEach
metody jest bezpieczne dla wątków?
Odpowiedzi
To zależy od tego, co masz na myśli, mówiąc o bezpieczeństwie wątków.
- Jeśli nie przeszkadza Ci, gdy inne wątki mogą modyfikować mapę, gdy jesteś w trakcie
forEach
połączenia, to tak, jest to bezpieczne wątkowo. - Jeśli chcesz, aby mapa była niemodyfikowalna, gdy
forEach
jest w toku, tak że inne wątki są blokowane lub zgłaszają błędy, jeśli próbują ją zmodyfikować, to nie, tak nie jest.
Dokumentacja API mówi:
Jednak nawet jeśli wszystkie operacje są bezpieczne dla wątków, operacje pobierania nie pociągają za sobą blokowania i nie ma żadnego wsparcia dla blokowania całej tabeli w sposób uniemożliwiający wszelki dostęp.
...
Podobnie Iteratory, Spliterators i Enumerations zwracają elementy odzwierciedlające stan tabeli skrótów w pewnym momencie lub od momentu utworzenia iteratora / wyliczenia. Nie rzucają
ConcurrentModificationException
... Należy pamiętać, że wyniki metod agregacji stanu ... są zwykle przydatne tylko wtedy, gdy mapa nie jest poddawana równoczesnym aktualizacjom w innych wątkach. W przeciwnym razie wyniki tych metod odzwierciedlają stany przejściowe, które mogą być odpowiednie do celów monitorowania lub szacowania, ale nie do sterowania programem.