Это мой класс:Почему я получаю ConcurrentModificationException, хотя я использую блокировки?
public class AComplicatedclass {
private List<Connection> activeConnections;
private Lock lock = new ReentrantLock();
public void printConnections() {
lock.lock();
for(Connection c : activeConnections){ //exception happens here
...prints details about connection
activeConnections.remove(c);
}
lock.unlock();
}
private class MyThread extends TimerTask {
public void run() {
lock.lock();
...can alter activeConnections....
lock.unlock();
}
}
}
Как вы можете видеть объект блокировки должен предотвратить проблемы из-за одновременный доступ к этому общему массиву. Тем не менее, когда вызывается метод printConnections()
, я получаю ConcurrentModificationException
в том, что for
.
Почему? Совпадающих изменений нет!
Пожалуйста, покажите, что вы делаете в петлю. «сделать что-то» очень неудобно – AlexR
Вероятно, что «... сделать что-то ...» добавляет или удаляет элементы в activeConnections. –
И вы можете захотеть взглянуть на ['Collections.synchronizedList()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html # synchronizedList (java.util.List)), чтобы упростить код. –