我有一个包含静态监听器列表的类,如下所示:
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
来保存监听器。
它避免了诸如 get
和 contains
之类的只读操作的并发瓶颈,但它是通过在变异操作中做更多工作以及修改可见性规则来实现这一点的。此外,变异操作会锁定整个列表,因此是并发瓶颈。
关于java - 限制迭代时删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573499/