Является ли метод forEach ConcurrentHashMap потокобезопасным? [дубликат]

Jan 05 2021

Если вы хотите перебрать все элементы в ConcurrentHashMap, используется ли forEachпоточно-ориентированный метод?

Ответы

1 JohnKugelman Jan 05 2021 at 11:08

Это зависит от того, что вы подразумеваете под потокобезопасностью.

  • Если вы согласны с тем, что другие потоки могут изменять карту, пока вы находитесь в середине forEachвызова, тогда да, это потокобезопасно.
  • Если вы хотите, чтобы карту нельзя было изменять во время forEachвыполнения, чтобы другие потоки блокировались или выходили из строя, если они попытаются изменить ее, тогда нет, это не так.

В документации API говорится:

Однако, несмотря на то, что все операции являются потокобезопасными, операции извлечения не влекут за собой блокировку, и нет никакой поддержки для блокировки всей таблицы таким образом, чтобы предотвратить любой доступ.

...

Точно так же итераторы, разделители и перечисления возвращают элементы, отражающие состояние хэш-таблицы в какой-то момент во время или после создания итератора / перечисления. Они не бросают ConcurrentModificationException.... Имейте в виду, что результаты методов агрегированного состояния ... обычно полезны только тогда, когда карта не подвергается одновременным обновлениям в других потоках. В противном случае результаты этих методов отражают переходные состояния, которые могут быть адекватными для целей мониторинга или оценки, но не для программного управления.