Auf Thema antworten

hi,




hmm, ich verstehe unter Synchronisierung eine Methodik, gemeinsame Ressourcen atomar zu nutzen.


dein angesprochener Fall ist nicht dein einziges Concurrency Problem, z.B.:


du iterierst die listeners

[code=Java]

        for (IoFutureListener<T> l : listeners) {

            l.operationComplete(this);

        }

[/code]

währendessen erfolgt ein Kontext Switch und es wird

[code=Java]

        removeFutureListener(...)

        ...

        addFutureListener(...)

[/code]

aufgerufen, das wirft zumindest eine ConcurrentModificationException in der Iteration.


eine Synchronisation über das listeners Objekt könnte beispielsweise so erfolgen:


[code=Java]

  final List<L> listeners = new ...;


  void addListener(L l) {

    synchronized(listeners) {

      listeners.add(l);

    }

  } 

 

  void removeListener(L l) {

    synchronized(listeners) {

      listeners.remove(l);

    }

  }

 

  void notifyListener(L l) {

    synchronized(listeners) {

      for(L l : listeners) {

        l.notify();

      }

    }

  } 

[/code]


gerade wenn ein Fall seeehr unwahrscheinlich ist, ist er nicht ausgeschlossen und muss imho gerade deshalb behandelt werden, da die Fehlersuche sich in diesen Fällen besonders schwierig gestaltet, weil das Szenario nicht leicht nachstellbar ist


g,

Christian



Oben