2013-07-10 39 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'的副本 –