Я новичок в Java8 и работаю над проблемой, когда несколько потоков (~ 10) записывают значения в Concurrent Hash Map. У меня есть другой специальный поток, который читает все значения, присутствующие в Concurrent Hash Map, и возвращает их (каждые 30 секунд). Является ли метод итерации по результату метода values () рекомендуемым способом получения результатов без получения исключения одновременной модификации?
Примечание: я прекрасно справляюсь с получением устаревших данных
Я просмотрел официальные документы, в которых написано:
Операции получения обычно не блокируются, поэтому могут перекрываться с операциями обновления. Извлечения отражают результаты самых последних завершенных операций обновления, проводимых с момента их появления. Для агрегатных операций, таких как putAll и clear, одновременный поиск может отражать вставку или удаление только некоторых записей. Аналогично, Итераторы, Сплитераторы и Перечисления возвращают элементы, отражающие состояние хеш-таблицы в некоторой точке во время или после создания итератора / перечисления. Они не генерируют исключение ConcurrentModificationException.
Однако метод doc values () говорит:
Возвращает представление коллекции значений, содержащихся в этой карте
Безопасен ли приведенный ниже кодовый поток?
for (String name: myMap.values()) {
System.out.println("name": + name);
}