Beste Weg, um zu verhindern, dass concurrent modification exception
Hier einige pseudo-code wie folgt.
public class MyObject
{
private List<Object> someStuff;
private Timer timer;
public MyObject()
{
someStuff = new ArrayList<Object>();
timer = new Timer(new TimerTask(){
public void run()
{
for(Object o : someStuff)
{
//do some more stuff involving add and removes possibly
}
}
}, 0, 60*1000);
}
public List<Object> getSomeStuff()
{
return this.someStuff;
}
}
Also im wesentlichen das problem ist, dass andere Objekte, die nicht in den obigen code nennen getSomeStuff (), um die Liste der für nur-lese-Zwecke. Ich bin immer concurrentmodificationexception in der timer-thread, wenn dies der Fall ist. Ich habe versucht, die getSomeStuff Methode synchronisiert, und sogar versucht synchronisierte Blöcke in der timer-thread, aber noch immer der Fehler. Was ist die einfachste Methode des Aufhörens der gleichzeitige Zugriff von der Liste?
InformationsquelleAutor thatidiotguy | 2012-04-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie entweder
java.util.concurrent.CopyOnWriteArrayList
oder eine Kopie (oder ein array mitCollection.toArray
- Methode) vor Durchlaufen der Liste in den thread.Außerdem, dass die Beseitigung in einer for-each-Konstruktion bricht iterator, so dass es nicht einen gültigen Weg, um Bearbeiten Sie die Liste in diesem Fall.
Aber Sie können Folgendes tun:
oder
Beachten Sie auch, dass wenn der code greift auf die Liste aus verschiedenen threads und die Liste geändert wird, müssen Sie synchronisieren. Zum Beispiel:
Aber beachten Sie, dass Operationen innerhalb Schlösser sollten möglichst kurz sein.
ok, siehe meine aktualisierte Bezug auf das entfernen/Iteration für Listen.
Ich glaube, dass ich gerade das Gefühl, dass etwas mit Java zu synchronisieren Schlüsselwort möglich gewesen wäre, aber Sie sagen, dass das nicht der Fall? Und welche Pakete sind diese Lock ReadWriteLock und? Auch, ich brauche nur zu sperren, die Liste selbst, während die run-Methode in der timer ausgeführt wird, ist dies die Methode, die Sie empfehlen?
Richtig. Die Art und Weise, die Sie Durchlaufen/entfernen brechen würde in einer single-thread-Umgebung. Das Schloss Klasse in java.util.concurrent-Paket. Sie Schloss nicht die Liste, sondern der Zugriff darauf. I. e. Operationen mit der Liste durchgeführt werden, innerhalb die Schlösser (obwohl es ist der Unterschied zwischen lese-und Schreibvorgang - damit die Leser nicht gegenseitig blockieren).
Ich versteh nur nicht alles in den code, der erwähnt, die Liste an alle. Sie sind nur Gebäude dieses lock-Objekt, aber die Liste wird nie erwähnt. Ist es verhindert, dass ALLE schreiben, die auf jedes Objekt?
InformationsquelleAutor Eugene Retunsky
Sollten Sie eine Kopie der Liste in
getSomeStuff()
. Die Veröffentlichung einer Referenz zu einem privaten Bereich macht es effektiv öffentlichkeit, es ist also nicht etwas, was Sie wollen, sowieso.Bedenken Sie auch, Rücksendung eine Kopie als
ImmutableList
oder zumindest als unveränderliche Liste.InformationsquelleAutor Adam Zalcman