Hi,
zu dieser Exception gibts ja eine Menge Lesestoff, ich habe jedoch einen Fall, wo sie meines Wissens nicht auftreten dürfte, es aber trotzdem tut. Der Code ist nichtmal besonders kompliziert:
Die ConcurrentModificationException tritt ja dann auf, wenn
- mehrere Threads auf eine Resource zugreifen oder
- ein einziger Thread eine Liste o. ä. verändert, während er über sie iteriert.
Beide Fälle meine ich im Code ausgeschlossen zu haben. Die kritischen Bereiche habe ich in einem synchronized - Block und Elemente werden aus der Original Map entfernt, während über eine vorher angelegte Kopie iteriert wird.
Habe ich einen Stolperstein übersehen?
Ich bin für jede Hilfe dankbar.
zu dieser Exception gibts ja eine Menge Lesestoff, ich habe jedoch einen Fall, wo sie meines Wissens nicht auftreten dürfte, es aber trotzdem tut. Der Code ist nichtmal besonders kompliziert:
Java:
private Map<Integer,Scriptable> scripts = Collections.synchronizedMap(new HashMap<Integer, Scriptable>());
@Override
public void run() {
while( true ) {
synchronized(scripts){
Vector<Scriptable> c = new Vector<Scriptable>();
c.addAll(scripts.values());
for(Scriptable script : c){
if( script.isFinished()) scripts.remove(new Integer(script.getId()));
}
}
try {
Thread.sleep( 500L );
}
catch( Exception x ) {
x.printStackTrace(System.out);
}
}
}
public void addScript( Scriptable script ){
synchronized(scripts){
scripts.put(new Integer(script.getId()), script);
}
}
Die ConcurrentModificationException tritt ja dann auf, wenn
- mehrere Threads auf eine Resource zugreifen oder
- ein einziger Thread eine Liste o. ä. verändert, während er über sie iteriert.
Beide Fälle meine ich im Code ausgeschlossen zu haben. Die kritischen Bereiche habe ich in einem synchronized - Block und Elemente werden aus der Original Map entfernt, während über eine vorher angelegte Kopie iteriert wird.
Habe ich einen Stolperstein übersehen?
Ich bin für jede Hilfe dankbar.