java - 在两个线程中使用相同的 Hashmap 时 Hashmap 中的并发修改异常

标签 java exception hashmap concurrentmodification

我正在开发一款通过网络玩的多人贪吃蛇游戏。 它运行良好,但偶尔会抛出 java.util.ConcurrentModification 异常。 这是在我的游戏主类的paintComponent()方法中抛出的。抛出此错误的代码是

 for (String name : map.keySet()) {
        if (!map.get(name).gameover) {
            for (int i = 0; i < map.get(name).length; i++) {
                rect = new Rectangle2D.Double(map.get(name).p[i].x,
                        map.get(name).p[i].y, width, width);
                g1.setColor(Color.black);
                g1.draw(rect);
                g1.setPaint(map.get(name).snakecolor);
                g1.fill(rect);
            }
        }
    }

Hashmap 映射是来自

的映射
        HashMap<String,Snake> 

其中 Snake 是具有蛇的所有属性的类。 主类还并行运行一个线程,用于通过服务器接收来自其他客户端的消息和更新。

线程端的迭代器也使用相同的映射(通过对该类的引用传递)。其代码如下所示。如果任何玩家的分数达到某个特定点并升级后,就会调用此函数。

    void levelUp(int level){
    for(String name:map.keySet()){
        map.get(name).level=level;
    }
    Game.speed=100/level;
}

我认为对象写入之间的冲突就是由于这个原因。任何人都可以建议这个问题的解决方案吗?

下面还给出了我将值放入 map 的代码。

void populateMap() {
    try {
        try {
            objin = new ObjectInputStream(socket.getInputStream());
        } catch (StreamCorruptedException e) {
            System.out.println("Stream Corrupted!");
        }
        Object name = objin.readObject();
        if (((Snake) name).player.equals("food_coord")) {
            Game.foodx = objin.readInt();
            Game.foody = objin.readInt() + 35;
            start = true;
            System.out.println("Game Started");
            return;
        } else {
            map.put(((Snake) name).player, (Snake) name);
            System.out.println("Recieved: " + ((Snake) name).player);
        }
    } catch (java.net.SocketException s) {
        JOptionPane.showMessageDialog(null, "Server Closed", "ERROR",
                JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

最佳答案

将您的 map 实现类更改为支持并发的类,例如 ConcurrentHashMap

关于java - 在两个线程中使用相同的 Hashmap 时 Hashmap 中的并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985991/

相关文章:

java - 使用具有字段作为外键的 JPA 插入记录到另一个表

java - errorString() 方法的异常的优点/缺点

python - 可用于制作英语词典的数据结构

java - 如何从文件读入并使用读取文件的输入创建新对象

c - C中具有不同数据类型的键值

java - 使用 JSoup 获取 JavaScript 内容

java - Android 上的 HighChart 动态更新

c++ - Noexcept 对派生类构造函数的 promise : can that be used without promising noexcept on base constructor?

JAVA 数组异常

Java 信使套接字