1. Fail-Fast (fail—fast)
Wenn ein Iterator zum Durchlaufen eines Collection-Objekts verwendet wird und der Inhalt des Collection-Objekts während des Durchlaufens geändert wird (hinzugefügt, gelöscht oder geändert), wird eine Concurrent Modification Exception ausgelöst.
Prinzip:Der Iterator greift während des Durchlaufens direkt auf den Inhalt der Collection zu und verwendet während des Durchlaufens eine modCount-Variable. Wenn sich der Inhalt der Collection während des Durchlaufens ändert, wird der Wert von modCount geändert. Jedes Mal, wenn der Iterator hashNext()/next() verwendet, um zum nächsten Element zu gelangen, prüft er, ob die modCount-Variable gleich dem Wert expectedmodCount ist. Wenn ja, wird der Durchlauf fortgesetzt; andernfalls wird eine Ausnahme ausgelöst und der Durchlauf beendet.
Hinweis:Die Bedingung zum Auslösen einer Ausnahme ist hier das Erkennen vonmodCount != expectedmodCountdieser Bedingung. Wenn der modCount-Wert gerade dann, wenn sich die Collection ändert, auf den expectedmodCount-Wert zurückgesetzt wird, wird die Ausnahme nicht ausgelöst. Daher können Sie sich beim Programmieren nebenläufiger Operationen nicht darauf verlassen, ob diese Ausnahme ausgelöst wird; diese Ausnahme wird nur zum Erkennen von Fehlern bei nebenläufigen Änderungen empfohlen.
Szenarien:Die Collection-Klassen im java.util-Paket sind alle fail-fast und können in einer Multithread-Umgebung nicht nebenläufig geändert werden (Änderung während der Iteration).
2. Fail-Safe (fail—safe)
Sammlungscontainer, die den Fail-Safe-Mechanismus verwenden, greifen während der Traversierung nicht direkt auf den Inhalt der Sammlung zu; stattdessen kopieren sie zuerst den ursprünglichen Sammlungsinhalt und traversieren die kopierte Sammlung.
Prinzip:Da die Iteration eine Kopie der ursprünglichen Sammlung traversiert, können Änderungen an der ursprünglichen Sammlung während der Traversierung vom Iterator nicht erkannt werden, sodass keine Concurrent Modification Exception ausgelöst wird.
> Nachteile:Der Vorteil des Kopierens des Inhalts besteht darin, dass eine Concurrent Modification Exception vermieden wird, aber ebenso kann der Iterator nicht auf die geänderten Inhalte zugreifen. Das heißt, der Iterator traversiert die Sammlungskopie, die in dem Moment erhalten wurde, als die Traversierung begann, und der Iterator ist sich der Änderungen, die während der Traversierung an der ursprünglichen Sammlung vorgenommen werden, nicht bewusst.
Szenarien:Die Container unter dem Paket java.util.concurrent sind alle fail-safe und können in einer Multithread-Umgebung gleichzeitig verwendet und gleichzeitig geändert werden.
Original-URL: http://www.cnblogs.com/ygj0930/p/6543350.html