Вы используете цикл for-each для итерации по своей коллекции 'points'.
Если ваше приложение является многопоточным, и вы изменяете (добавляете, удаляете и т. Д.) Коллекцию 'points', вы получите эту ошибку.
У вас есть пара вариантов.
Во-первых, это использование регулярного цикла for и получение объекта с текущим индексом.
for (int i = 0; i < points.size(); i++) {
PointBasic p = points.get(i); // could be different depending upon your collection type.
...
}
Однако, если вы изменяете набор точек во время итерации, вы можете пропустить некоторые данные и не узнаете об этом: O
Если эта операция обязательна, попробуйте синхронизировать код.
(Синхронизация кода гарантирует, что код, заключенный в один и тот же блок, никогда не будет выполняться одновременно в разных потоках.)
<global>
private Object pointsLock = new Object();
</global>
synchronized (pointsLock) {
for (PointBasic p : points) {
BasicDBObject pkey = new BasicDBObject();
boolean isPhysic = p.isPhysicPoint();
pkey.put("isphysic", isPhysic);
pkey.put("x", p.getX());
pkey.put("y", p.getY());
pkey.put("picurl", p.getPicUrl());
pkey.put("area", p.getArea());
plist.add(pkey);
}
}
Обернуть любой код, который изменяет асинхронность «точек» в том же синхронизированном блоке.
Также убедитесь, что вы синхронизируете, используя один и тот же объект блокировки.
Вы также можете использовать итератор (вообще не рекомендуется) или цикл while, но в конце они делают то же самое, что и цикл for, и, вероятно, менее эффективны.
Я точно не следовал приведенной трассировке стека, но она кое-что говорит об обновлениях точек, поэтому я надеюсь, что я не опубликовал полностью несвязанный материал. :)