PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Element sauber aus Liste entfernen



nul
07-10-2006, 11:40
So, meld mich wieder mal mit nem Fall der mir schwierigkeiten macht.
Ich habe ne Application die Nachrichten verarbeitet und eine Menge von Objekten die diese Nachricht verarbeiten. Nun bekomme ich aber eine ConcurrentException wenn ich versuche eines dieser verarbeitenden Objekte zu entfernen.
Der Code sieht so aus:

public synchronized void register( MessageLogger logger ) {
synchronized ( this.loggers ) {
if ( !this.loggers.contains( logger ) )
this.loggers.add( logger );
}
}

public synchronized void unregister( MessageLogger logger ) {
synchronized ( this.loggers ) {
this.loggers.remove( logger );
}
}

public synchronized void report( Message message ) {
synchronized ( this.loggers ) {
for ( MessageLogger logger : this.loggers ) {
try {
logger.redirectMessage( message );
} catch ( ConfigurationException e ) {
System.err.println( logger.getClass() + ": Invalid logger value(s)." );
e.printStackTrace();
}
}
}
}
Die Fehlermeldung:

Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodificatio n(LinkedList.java:617)
at java.util.LinkedList$ListItr.next(LinkedList.java: 552)
at moe.patrol.core.Reporter.report(Reporter.java:96)
at moe.patrol.core.connection.core.AbstractReader.doM essageTasks(AbstractReader.java:56)
at moe.patrol.core.connection.smard.SmardReader.run(S mardReader.java:76)
at java.lang.Thread.run(Thread.java:595)
Das Problem tritt also beim for auf. Nun ist mir das schon klar was da nicht zusammenpasst, aber mir faellt leider nicht ein wie man das nun loesen kann :(

Hat jemand vielleicht nen Vorschlag?

mfg
nul

OpOs
08-10-2006, 16:43
tja, was macht denn die redirect-funktion? veraenderst du da irgendwas?

sieht so aus, als wuerdest du irgendwas modifizieren, was du nicht modifizieren solltest...

solange du nicht sagst, was du da machst, ist es schwer, 'ne alternative anzubieten

Waxolunist
10-10-2006, 11:04
Ich kann dir nur sagen, dass z.B. der Fehler auch auftritt, wenn du eine Liste mit Iterator durcharbeitest, und anstatt iterator.remove einen call zu list.remove machst.

Vielleicht hilft dir das, denn an deinem Code-Stück kann ich nicht erkennen, wo genau der Fehler auftritt, da ich nicht weiß, was im redirect geschieht.