Java 集合中常见 checkForComodification() 方法的到底有什么作用?还有 modCount 和 expectedModCount 作用?
主要是用来实现 fail-fast 机制
有两个线程(线程 A,线程 B),其中线程 A 负责遍历 list、线程 B 修改 list。 -线程 A 在遍历 list 过程的某个时候(此时 expectedModCount = modCount=N),线程启动,
同时线程 B 增加一个元素,这是 modCount 的值发生改变(modCount + 1 = N + 1)。 线程 A 继续遍历执行 next 方法时,
通告 checkForComodification 方法发现 expectedModCount = N , 而 modCount = N + 1,两者不等,
这时就抛出 ConcurrentModificationException 异常,从而产生 fail-fast 机制。
1 | /** |
在父类 AbstractList 中定义了一个 int 型的属性:modCount
1 | protected transient int modCount = 0; |
在 ArrayList 的所有涉及结构变化的方法中都增加 modCount 的值,包括:add()、remove()、addAll()、removeRange()及 clear()方法。这些方法每调用一次,modCount 的值就加 1。注:add()及addAll()方法的modCount的值是在其中调用的ensureCapacity()方法中增加的。
AbstractList 中的 iterator()方法(ArrayList 直接继承了这个方法)使用了一个私有内部成员类 Itr,生成一个 Itr 对象(Iterator 接口)返回:
1 | public Iterator iterator() { return new Itr(); } |
Itr 实现了 Iterator()接口,其中也定义了一个 int 型的属性:expectedModCount,这个属性在 Itr 类初始化时被赋予 ArrayList 对象的 modCount 属性的值。
1 | int expectedModCount = modCount; |
注:内部成员类Itr也是ArrayList类的一个成员,它可以访问所有的AbstractList的属性和方法。理解了这一点,Itr类的实现就容易理解了。
在 Itr.hasNext()方法中:
1 | public boolean hasNext() { return cursor != size; } |
调用了 AbstractList 的 size,比较当前光标位置是否越界。
1 | public Object next() |