java - 在没有迭代器的情况下同时修改/删除 HashMap 中的条目

标签 java hashmap concurrentmodification

问题的一些背景:我有一个类负责通知各个客户有关服务的变化。因此,该类有多个监听器的 HashMap,并在需要时通过迭代这些 HashMap 来调用它们的方法(它还具有从这些 HashMap 中添加/删除监听器的方法)。问题是,我经常需要在迭代某些监听器时删除它们...并且我需要能够从循环外部调用remove(...)方法。两者都进行迭代和删除发生在同一个线程上。 类示例:

class SomeClass {
    Map<Listener, Boolean> listeners = new HashMap<Listener, Boolean>();

    void add(Listener listener) {
        listeners.put(listener, true);
    }

    void remove(Listener listener) {
        listeners.remove(listener);
    }

    void notifyListeners() {
        Iterator<Map.Entry<Listener, Boolean>> it = listeners.entrySet().iterator();
        while (it.hasNext()) {
            it.next().getKey().onDo();
        }
    }

    static interface Listener{
        void onDo();
    }}

以及我想调用remove(...)的方式(以及如何失败):

final SomeClass someClass = new SomeClass();

    Listener a = new Listener(){
        @Override
        public void onDo() {
            someClass.remove(this);
        }
    };

    Listener b = new Listener(){
        @Override
        public void onDo() {
            someClass.remove(this);
        }
    };

    Listener c = new Listener(){
        @Override
        public void onDo() {
            someClass.remove(this);
        }
    };

    someClass.add(a);
    someClass.add(b);
    someClass.add(c);

    someClass.notifyListeners();
    // java.util.ConcurrentModificationException

有什么技巧可以做到这一点吗?

最佳答案

关于java - 在没有迭代器的情况下同时修改/删除 HashMap 中的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072837/

相关文章:

java - 在 ArrayList 与 LinkedList 中间插入

java - 领英解析。如何一个接一个地运行任务?

java - 如果我在一个项目中有更多文件,我需要将所有字段设为静态吗?

java - 我应该如何持久保存应用程序静态集合,例如登录用户的 HashMap ?

java - 理解 java 8 中 HashMap 类的 hash() 方法的方法注释

java - 为什么clear hashmap方法会清除数组列表中添加的映射

java - 并发修改异常,尽管等待完成

java - 使用迭代器删除条目时出现 ConcurrentModificationException

java - ConcurrentModificationException 小游戏

java - 解析Java中其他文本中嵌入的日期