entModificationException上的ArrayL

entModificationException上的ArrayL

本文介绍了java.util.ConcurrentModificationException上的ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个服务器类和里面一个定时器这是应该清除死的客户端(客户谁崩溃)。我跟着下面的例子中通过锁定集合时,定时器遍历用户,但我仍然得到此异常(后我崩溃连接的客户端)。

 列表<使用者>用户;
清单<使用者> connectedUsers;
ConcurrentMap<使用者,IClient>客户;...用户= Collections.synchronizedList(新的ArrayList<使用者>());
connectedUsers =新的ArrayList<使用者>();
客户=新的ConcurrentHashMap<使用者,IClient>();
定时器=新定时器();
timer.schedule(新ClearDeadClients(),5000,5000);...类ClearDeadClients扩展的TimerTask {
    公共无效的run(){
        同步的(用户){
            迭代器<使用者>它= users.iterator();
            而(it.hasNext()){
                用户的用户= it.next(); //抛出异常
                如果(!connectedUsers.contains(用户)){
                    users.remove(用户);
                    clients.remove(用户);
                }
            }
        }        connectedUsers.clear();
    }
}


解决方案

您需要从迭代器而不是集合中删除。它是这样的,而不是:

 的Iterator<使用者>它= users.iterator();
而(it.hasNext()){
    用户的用户= it.next();
    如果(!connectedUsers.contains(用户)){
         it.remove();
         clients.remove(用户);
     }
}

I have a Server class and a Timer inside it which is supposed to clear dead clients (clients who crashed). I followed the example below by locking the collection when the Timer iterates over the users but I still get this exception (after I crash a connected client).

http://www.javaperformancetuning.com/articles/fastfail2.shtml

List<User> users;
List<User> connectedUsers;
ConcurrentMap<User, IClient> clients;

...

users = Collections.synchronizedList(new ArrayList<User>());
connectedUsers = new ArrayList<User>();
clients = new ConcurrentHashMap<User, IClient>();
timer = new Timer();
timer.schedule(new ClearDeadClients(), 5000, 5000);

...

class ClearDeadClients extends TimerTask {
    public void run() {
        synchronized (users) {
            Iterator<User> it = users.iterator();
            while (it.hasNext()) {
                User user = it.next(); // Throws exception
                if (!connectedUsers.contains(user)) {
                    users.remove(user);
                    clients.remove(user);
                }
            }
        }

        connectedUsers.clear();
    }
}
解决方案

You need to remove from the iterator not the collection. It would look like this instead:

Iterator<User> it = users.iterator();
while (it.hasNext()) {
    User user = it.next();
    if (!connectedUsers.contains(user)) {
         it.remove();
         clients.remove(user);
     }
}

这篇关于java.util.ConcurrentModificationException上的ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-03 20:00