我有一个类,它包含一个静态的监听器列表,如下所示:
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)
,这将触发{ {1}}?
答案 0 :(得分:1)
使用CopyOnWriteArrayList
代替ArrayList
来容纳听众。
它避免了get
和contains
之类的只读操作的并发瓶颈,但它通过在变更操作中执行更多工作以及修改可见性规则来实现此目的。此外,变异操作会锁定整个列表,因此是并发瓶颈。