2012-06-14 13 views

Odpowiedz

31

Wiele kolekcji Java tworzy iteratory "fail-fast", co oznacza, że ​​jeśli kolekcja zostanie zmieniona po utworzeniu iteratora, iterator zostanie unieważniony i jak najszybciej wyrzuci numer ConcurrentModificationException. (W porównaniu do niepowodzenia później lub zwracania nieprawidłowych danych.)

Aby wspomóc tę funkcję, kolekcja musi śledzić, czy została zmodyfikowana. Za każdym razem, gdy kolekcja jest zmieniana, wzrasta ona o modcount. Gdy kolekcja tworzy iterator, iterator przechowuje wartość modcount od momentu jej utworzenia. Następnie za każdym razem, gdy spróbujesz użyć iteratora, sprawdza, czy jego zapisany modcount jest inny niż bieżący zbiór kolekcji rodzica modcount; jeśli tak, iterator kończy się niepowodzeniem z ConcurrentModificationException.

(Wyjątkiem od tej zasady jest to, że zmiany w kolekcji wykonane przez samego iteratora (jak remove metody iteracyjnej) nie zmieniają faktu iterator).

+1

dzięki za tym naprawdę dobre wytłumaczenie. Wiedziałem, że zrobił coś takiego, ale nie szczegółowe – moeTi

+0

Bardzo dobre wyjaśnienie. Teraz ma sens. –

+0

kod: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ListItr – roottraveller