java - 限制迭代时删除元素

标签 java list concurrency iterator

我有一个包含静态监听器列表的类,如下所示:

public class StaticFoo{

    public static interface ActionInterface{
        void onAction();
    }

    private static ArrayList<ActionInterface> sList = new ArrayList();

    public static ArrayList<ActionInterface> getList(){
        return sList;
    }

    public static void addAction(ActionInterface action){
        sList.add(action);
    }

    public static boolean removeAction(ActionInterface action){
        return sList.remove(action);
    }

}

我现在的问题是:如果我迭代此列表并调用该接口(interface)的 onAction 方法,如何防止其中一个监听器调用 StaticFoo.removeAction(this),这将触发 ConcurrentModificationException

最佳答案

使用CopyOnWriteArrayList而不是ArrayList来保存监听器。

它避免了诸如 getcontains 之类的只读操作的并发瓶颈,但它是通过在变异操作中做更多工作以及修改可见性规则来实现这一点的。此外,变异操作会锁定整个列表,因此是并发瓶颈。

关于java - 限制迭代时删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573499/

相关文章:

go - 与 channel 同时写入

java - JSTL c :forEach causes @ViewScoped bean to invoke @PostConstruct on every request

java - 使用正确的ExecutorService异步执行任务

python - 在列表中查找包含未知值的元组结构

python - 在 Python 中查找列表的 n 长度连续子列表的最优雅方法是什么?

Java 内存可见性和 AtomicReference 的

Java 并发 JDK 1.6 : Busy wait does better than signalling? Effective Java #51

java - 使用 Jackson 将 JSON 字符串或对象反序列化为 String 字段

java - Maven:如何更新 html 文件以使用新的缩小和连接的 JS 和 CSS 文件?

python打印正则表达式匹配产生空列表