1

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

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);
    }

}

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

4

1 回答 1

1

使用CopyOnWriteArrayList代替ArrayList来容纳听众。

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

于 2013-07-10T14:42:16.930 回答