2013-07-10 38 views
1

我有hols听众的静态列表一类,像这样:限制移除元素,而迭代

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

回答

1

使用CopyOnWriteArrayList而不是ArrayList来容纳听众。

它避免了只读操作(例如getcontains)上的并发瓶颈,但它通过在变更操作和修改可见性规则方面做了大量工作。此外,变异操作会锁定整个列表,因此是并发瓶颈。

+0

另一种方法是使用'toArray'迭代'ArrayList'的副本 –