Является ли метод forEach ConcurrentHashMap потокобезопасным? [дубликат]
Если вы хотите перебрать все элементы в ConcurrentHashMap, используется ли forEach
поточно-ориентированный метод?
Ответы
Это зависит от того, что вы подразумеваете под потокобезопасностью.
- Если вы согласны с тем, что другие потоки могут изменять карту, пока вы находитесь в середине
forEach
вызова, тогда да, это потокобезопасно. - Если вы хотите, чтобы карту нельзя было изменять во время
forEach
выполнения, чтобы другие потоки блокировались или выходили из строя, если они попытаются изменить ее, тогда нет, это не так.
В документации API говорится:
Однако, несмотря на то, что все операции являются потокобезопасными, операции извлечения не влекут за собой блокировку, и нет никакой поддержки для блокировки всей таблицы таким образом, чтобы предотвратить любой доступ.
...
Точно так же итераторы, разделители и перечисления возвращают элементы, отражающие состояние хэш-таблицы в какой-то момент во время или после создания итератора / перечисления. Они не бросают
ConcurrentModificationException
.... Имейте в виду, что результаты методов агрегированного состояния ... обычно полезны только тогда, когда карта не подвергается одновременным обновлениям в других потоках. В противном случае результаты этих методов отражают переходные состояния, которые могут быть адекватными для целей мониторинга или оценки, но не для программного управления.