Почему ConcurrentModificationException брошен и как отладить его

>>> myDict = {"testing": 1, "testing2": 2, "my_key": 3}
>>>
>>>
>>> def updatedata(data):
...     k = 'my_key'
...     for key, val in data.items():  # use a different variable to reduce confusion
...         if key == 'my_key':
...             data[key] = 'True'  # specify the key, not the value
...     return data  # optional, unless you want to save into a new variable
...
>>>
>>> updatedata(myDict)
>>> myDict
{'testing': 1, 'testing2': 2, 'my_key': 'True'}
>>>
116
задан Raedwald 16 September 2019 в 15:19
поделиться

5 ответов

Это не проблема синхронизации. Это произойдет, если базовый набор, который выполняется с помощью итераций, будет изменен чем-нибудь кроме самого Итератора.

Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
   Entry item = it.next();
   map.remove(item.getKey());
}

Это бросит ConcurrentModificationException, когда it.hasNext () назовут во второй раз.

корректный подход был бы

   Iterator it = map.entrySet().iterator();
   while (it.hasNext())
   {
      Entry item = it.next();
      it.remove();
   }

Предположение, что этот итератор поддерживает удаление () операция.

247
ответ дан Bert F 24 November 2019 в 02:12
поделиться

Попытайтесь использовать ConcurrentHashMap вместо плоскости HashMap

65
ответ дан Chochos 24 November 2019 в 02:12
поделиться

Это меньше походит на проблему синхронизации Java и больше как проблема блокировки базы данных.

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

Мог быть то, что уровень изоляции должен быть выше. При разрешении "грязных чтений" возможно, необходимо натолкнуться до сериализуемого.

2
ответ дан duffymo 24 November 2019 в 02:12
поделиться

Попробуйте или CopyOnWriteArrayList или CopyOnWriteArraySet в зависимости от того, что Вы пытаетесь сделать.

0
ответ дан Javamann 24 November 2019 в 02:12
поделиться

В Java 8 можно использовать лямбда-выражение:

map.keySet().removeIf(key -> key condition);
1
ответ дан 24 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: