/**
* The number of times this list has been <i>structurally modified</i>.
* Structural modifications are those that change the size of the
* list, or otherwise perturb it in such a fashion that iterations in
* progress may yield incorrect results.
*
* <p>This field is used by the iterator and list iterator implementation
* returned by the {@code iterator} and {@code listIterator} methods.
* If the value of this field changes unexpectedly, the iterator (or list
* iterator) will throw a {@code ConcurrentModificationException} in
* response to the {@code next}, {@code remove}, {@code previous},
* {@code set} or {@code add} operations. This provides
* <i>fail-fast</i> behavior, rather than non-deterministic behavior in
* the face of concurrent modification during iteration.
*
* <p><b>Use of this field by subclasses is optional.</b> If a subclass
* wishes to provide fail-fast iterators (and list iterators), then it
* merely has to increment this field in its {@code add(int, E)} and
* {@code remove(int)} methods (and any other methods that it overrides
* that result in structural modifications to the list). A single call to
* {@code add(int, E)} or {@code remove(int)} must add no more than
* one to this field, or the iterators (and list iterators) will throw
* bogus {@code ConcurrentModificationExceptions}. If an implementation
* does not wish to provide fail-fast iterators, this field may be
* ignored.
*/
protected transient int modCount = 0;
借用一下网上的翻译:
modCount指的是list被结构性修改的次数。
结构性修改是指改变list的size大小,或者其他的情况导致正在迭代迭代的时候出现了错误的结果
这个字段用于迭代器和列表迭代器的实现类,由迭代器和列表迭代器返回。
如果这个值被意外改变,这个迭代器或者列表迭代器将会抛出异常来响应。add,next,remove,previous,st,add
在迭代过程中,它提供了fail-fast行为而不是不确定的行为来处理并发修改。
子类使用这个字段是可选的,如果子类希望提供fail-fast迭代器,它仅仅需要在add(int),remove(int)方法(或者它重写的其他任何会修改这个列表的方法)中添加这个字段。
调用一次add(int,E)或者remove(int,E)方法仅仅给这个字段加1,否则迭代器会抛出异常。
如果一个实现类不希望提供fail-fast迭代器,则忽略这个字段。
exceptedModCount
expectedModCount = alist.modCount;
modCount用法
在线程不安全的集合集合中,在某些方法中,初始化迭代器会给modCount赋值,如果在遍历的过程中,一旦发现这个对象的modCount和迭代器存储的modCount不一样,就会报错。
fail-fast机制
在线程不安全的集合中,如果在使用迭代器的过程中,发现集合被修改,会抛出ConcurrentModificationExceptions错误,这就是快速失败机制。
对于集合进行结构性修改时,modCount都会增加,在初始化迭代器时,modCount的值会赋值给expectedModCount,在迭代过程中,只要modCount变了(不是线程安全的,其他线程可能修改)int expectedModCount=modCount就不成立了,迭代器监测到这一点,就会抛出错误:ConcurrentModificationExceptions