Czy metoda ConcurrentHashMap forEach jest bezpieczna wątkowo? [duplikować]

Jan 05 2021

Jeśli chcesz wykonać iterację po wszystkich elementach w ConcurrentHashMap, czy użycie forEachmetody jest bezpieczne dla wątków?

Odpowiedzi

1 JohnKugelman Jan 05 2021 at 11:08

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 forEachpołączenia, to tak, jest to bezpieczne wątkowo.
  • Jeśli chcesz, aby mapa była niemodyfikowalna, gdy forEachjest 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.