为什么即使我使用锁也会得到 ConcurrentModificationException?

Pha*_*ate 0 java concurrency

这是我的课:

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.

怎么来的?根本没有并发修改!

The*_*tor 5

很可能您在 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)