Konzepte zum Ändern des Elements in der Sammlung während der Iteration?

8

Ich habe diese Anweisung gefunden, wenn ein Thread eine Auflistung direkt ändert, während sie mit einem Fail-Fast-Iterator über die Auflistung iteriert, löst der Iterator diese Ausnahme aus. in Ссылка .

Ich habe festgestellt, dass die gleichzeitige Änderung sogar unter den Code

geworfen wird %Vor%

Frage1: - Also kann ich sagen, dass die for-for-Schleife auch den Fail-Fast-Iterator intern verwendet? Wenn ich aber den Code unten ausführe, funktioniert es gut

%Vor%

Question2: - Eine andere Frage ist, wenn Aussage sagen

  

wenn ein Thread eine Sammlung ändert

Meine Vermutung ist, dass die Modifikation hier das Entfernen oder Hinzufügen bedeutet, nicht für die Aktualisierung des Elements innerhalb der Sammlung für die Listenschnittstelle, während es auch die Modifikation des Elements für die eingestellte Schnittstelle beinhaltet. Recht? Zumindest die Programme, die ich ausprobiert habe, sind bei ihnen der Fall.

Bearbeiten

In Bezug auf set bezweifle ich meine obige Aussage, d. h. es löst eine gleichzeitige Modifikationsausnahme aus, wenn wir versuchen, den Satz während des Iterierens zu modifizieren. Ich habe unter dem Code versucht, aber keine Ausnahme ausgelöst

%Vor%

Idealerweise nach Anweisung, wenn die Menge zu einem beliebigen Zeitpunkt nach dem Erstellen des Iterators geändert wird Ссылка sollte die Ausnahme für die gleichzeitige Änderung ausgelöst werden, aber nicht. Nicht sicher warum?

    
M Sach 10.09.2011, 14:37
quelle

2 Antworten

11
  

Frage1: - Also kann ich sagen, dass die for-for-Schleife auch intern den Fail-Fast-Iterator verwendet? Wenn ich jedoch den folgenden Code ausführe, funktioniert es gut

Ja, das stimmt. Sehen Sie sich den kompilierten Code mit dem Befehl javap an, um dies zu überprüfen, wenn Sie möchten.

  

Meine Vermutung ist, dass die Modifikation hier das Entfernen oder Hinzufügen bedeutet, nicht für die Aktualisierung des Elements innerhalb der Sammlung für die Listenschnittstelle, während es auch die Modifikation des Elements für die Set-Schnittstelle beinhaltet. Recht? Bei den Programmen, die ich probiert habe, ist es bei ihnen der Fall.

Das stimmt, wenn Sie emp1.setEmpId(2) oder etwas Ähnliches machen, wird die Iteration nicht fehlschlagen.

  

... es sollte die Ausnahme für die gleichzeitige Änderung auslösen, aber nicht. Nicht sicher warum?

Es wird nur die Ausnahme ausgelöst, wenn Sie die Liste ändern. Beachten Sie, dass die Liste Verweise auf Objekte enthält. Wenn Sie die Objekte ändern, ändern sich die Referenzen nicht, also die Liste ändert sich nicht.

    
aioobe 10.09.2011, 14:38
quelle
2

Wenn nicht zwei verschiedene Threads darauf zugreifen, besteht keine Gefahr, die Elemente in der Liste zu ändern. Ihre for-Datei wirft nicht concurrent modification exception , weil Sie die Elemente der Menge ändern, nicht die Menge selbst.

    
fastcodejava 10.09.2011 15:37
quelle

Tags und Links