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そのインターフェイスのメソッドを呼び出す場合、それらのリスナーの 1 つが呼び出しているのを防ぐ方法StaticFoo.removeAction(this)ConcurrentModificationException?

4

1 に答える 1

1

リスナーを保持するCopyOnWriteArrayList代わりに使用します。ArrayList

getやなどの読み取り専用操作での同時実行性のボトルネックを回避しますcontainsが、変更操作でより多くの作業を行い、可視性ルールを変更することでこれを実現します。さらに、変更操作はリスト全体をロックするため、同時実行のボトルネックになります。

于 2013-07-10T14:42:16.930 に答える