2016-07-25 11 views
0

Ich habe einen Code-Schnipsel unten. Ich habe 2 Threads A und B zur gleichen Zeit ausgeführt.Gibt es ConcurrentModificationException oder nicht in Schleife

List<String> listPeople = new ArrayList<>(); 
// Add more item 
..... 

Thread A 
for (String item : listPeople) { 
    System.out.println("Name is: " + item.name); 
} 

Thread B 
- add/remove item to list people 

Bei dieser Form der for-Schleife, schleift er über iterator der Liste. Wird es mit der ConcurrentModificationException abstürzen?

+0

Wie @Daniel Pryden in seiner Antwort erklärt, können Sie nicht darauf zählen. Manchmal kann es ConcurrentModificationException auslösen, andere Male möglicherweise nicht. –

+0

Danke für Ihre Antwort. Aus Sicherheitsgründen sollte ich für (;;) aussagen, oder? –

Antwort

4

Vom ConcurrentModificationException Javadoc:

Beachten Sie, dass diese Ausnahme zeigt nicht immer, dass ein Objekt durch einen verschiedenen Thread gleichzeitig modifiziert wurde. [...]

Beachten Sie, dass Fail-Fast-Verhalten nicht garantiert werden kann, da es im Allgemeinen unmöglich ist, bei unsynchronisierten simultanen Modifikationen harte Garantien zu geben. Fail-Fast-Operationen werfen ConcurrentModificationException auf Best-Effort-Basis. Daher wäre es falsch, ein Programm zu schreiben, das für seine Korrektheit von dieser Ausnahme abhängig ist: ConcurrentModificationException sollte nur zur Erkennung von Fehlern verwendet werden.

+0

Danke für Ihre Antwort. Aus Sicherheitsgründen sollte ich für (;;) aussagen, oder? –

+0

@HuyDuongTu: Nein, aus Sicherheitsgründen sollten Sie entweder die gemeinsame Nutzung der Sammlung über Threads vermeiden oder eine threadsichere Implementierung verwenden. Sie können beispielsweise alle Zugriffe der 'ArrayList'-Variablen mit derselben Monitorsperre synchronisieren. –

Verwandte Themen