Heim >Java >javaLernprogramm >ConcurrentModificationException bei der Verwendung von Iterator in Java
In Multithread -Java -Umgebungen kann das Versuch, eine Sammlung zu ändern, während sie mit einem Iterator über sie iteriert, zu einem ConcurrentModificationException
führen. Diese Ausnahme erfolgt, weil der interne Zustand der Sammlung inkonsistent wird.
Hier ist ein Beispiel, das die Ausnahme veranschaulicht:
<code class="language-java">Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000) at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)</code>
Diese Ausnahme erfolgt unter diesen Bedingungen:
modCount
), um Modifikationen zu erkennen und die Ausnahme auszugeben. Algorithmus zur Reproduktion der Ausnahme
Dieser Algorithmus zeigt, wie man in Java eine ConcurrentModificationException
auslöst:
ArrayList
. ArrayList
. list.iterator()
. ArrayList
(z. B. Fügen oder Entfernen von Elementen). ConcurrentModificationException
wird geworfen, wenn der Iterator die Modifikation erkennt. Dieser Code wirft ein
<code class="language-java">import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ConcurrentModificationExample { public static void main(String[] args) { List<integer> myList = new ArrayList<>(); myList.add(1); myList.add(2); myList.add(3); Iterator<integer> iterator = myList.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); System.out.println("Value: " + value); if (value == 2) { myList.remove(value); // Modification during iteration! } } } }</integer></integer></code>, weil
die Liste ändert, während der Iterator sie durchquert. ConcurrentModificationException
myList.remove(value)
Um diese Ausnahme zu vermeiden, verwenden Sie diese Ansätze:
: Verwenden Sie die Methode Iterator.remove()
, um Elemente während der Iteration zu entfernen. Diese Methode ist sicher, weil sie so konzipiert ist, dass sie mit dem internen Zustand des Iterators zusammenarbeitet.
iterator.remove()
Erstellen Sie eine Kopie der Liste, bevor Sie iteriert werden, und ändern Sie die Kopie.
Für gleichzeitige Modifikationsszenarien verwenden Sie Thread-Safe-Sammlungen wie oder . CopyOnWriteArrayList
ConcurrentHashMap
Einschließen Sie die Iteration und Modifikation in einen synchronisierten Block, um die Sicherheit der Gewinde zu gewährleisten.
Iterator.remove()
<code class="language-java">import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class SafeRemovalExample { public static void main(String[] args) { List<integer> myList = new ArrayList<>(); myList.add(1); myList.add(2); myList.add(3); Iterator<integer> iterator = myList.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); System.out.println("Value: " + value); if (value == 2) { iterator.remove(); // Safe removal using iterator.remove() } } System.out.println(myList); } }</integer></integer></code>
Das obige ist der detaillierte Inhalt vonConcurrentModificationException bei der Verwendung von Iterator in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!