这是我的课:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,锁对象应该可以防止由于并发访问该共享数组而导致的问题。然而,当printConnections()方法被调用时,我ConcurrentModificationException在那个for.
怎么来的?根本没有并发修改!
很可能您在 for 循环中修改了您的集合。正如ConcurrentModificationException上的文档所述
例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。
迭代器抛出异常的原因是它无法再确定下一个要返回哪个元素。
因此,如果您想修改您的集合,您需要切换到CopyOnWriteArrayList 之类的内容或显式使用Iterator,如
Iterator<Connection> iterator = activeConenctions.iterator();
while(iterator.hasNext()) {
Connection c = iterator.next();
if(/* what ever */) {
iterator.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |