2012-06-14 21 views

risposta

31

Molte delle raccolte Java producono iteratori "fail-fast", il che significa che se la raccolta viene modificata dopo la creazione di un iteratore, l'iteratore verrà invalidato e verrà lanciato un ConcurrentModificationException non appena possibile. (Rispetto a fallire successivamente o restituire dati non validi.)

Per supportare questa funzionalità, la raccolta deve tenere traccia di se è stata modificata. Ogni volta che la raccolta viene modificata, incrementa modcount. Quando la raccolta produce un iteratore, l'iteratore memorizza il valore di modcount da quando è stato creato. Quindi, ogni volta che si tenta di utilizzare l'iteratore, controlla se il file salvato è modcount diverso dall'attuale modcount della raccolta principale; se lo è, l'iteratore ha esito negativo con uno ConcurrentModificationException.

(Un'eccezione a questa regola è che le modifiche alla raccolta effettuata tramite l'iteratore stesso (come il metodo del iteratore remove) non invalidano l'iteratore.)

+1

grazie per questo davvero buona spiegazione. Sapevo che faceva qualcosa di simile, ma non dettagliato – moeTi

+0

Ottima spiegazione. Ora ha senso. Codice –

+0

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

Problemi correlati