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?
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.
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.
Tags und Links java