ли реализация итератора различна для разных datastructures или есть кто-то метод в рамках этих структур данных, которые проливают ConcurrentModificationException?
Да, существуют различные Iterator
реализации внутри Collection
классов.
Например, HashMap
класс (использует HashIterator
внутренне), ConcurrentHashMap
(использует KeyIterator
, ValueIterator
и т.д .. внутри), ArrayList
(использует Iterator
из AbstractList
), и т.д ..
Итератор Hashmap различна из реализации Iterator ConcurrentHashMap.
итератора HashMap в поддерживать номер версии (expectedModCount
) и проверки checkForComodification()
, как показано ниже:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
Таким образом, в середине итерации, если основной размер коллекции изменяется (путем добавления/удаления элементы), затем Iterator
бросок ConcurrentModificationException
, как показано выше.
В случае, когда ConcurrentHashMap
в Iterator
вариантах осуществления не выполняет вышеуказанную проверку, поэтому он не бросает ConcurrentModificationException
. Вы также можете найти ту же точку из API ConcurrentHashMap
here.
Они (ConcurrentHashMaps) не бросают ConcurrentModificationException. Однако итераторы предназначены для использования только по одному потоку за раз.