ArrayList中的modCount个人理解

/**
     * The number of times this list has been structurally modified.
     * 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.
     *
     * 

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 * fail-fast behavior, rather than non-deterministic behavior in * the face of concurrent modification during iteration. * *

Use of this field by subclasses is optional. 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

 

 

 

 

 

 

你可能感兴趣的:(java小知识点)