zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【集合我能讲两小时060】arraylist的fail-fast机制是什么原理?

集合原理 什么 机制 小时 ArrayList fast 我能
2023-09-27 14:29:28 时间
arraylist的fail-fast机制是什么原理?

采用了fail-fast机制,面对并发修改时,会立即失败,报concurrentModificationException并发修改异常。

arraylist的父类abstractlist中有一个类属性,protected transient int modCount = 0; 这个属性代表了list被结构性修改的次数。

结构性修改是指:改变了list的size大小。

这个字段用于迭代器和列表迭代器的实现类中,由迭代器和列表迭代器的方法返回。如果这个值被意外修改,就会抛出ConcurrentModificationException异常。

在迭代过程中,它提供了fail-fast机制,而不是不确定的行为来处理并发修改。子类使用这个字段是可选的, 如果子类希望提供fail-fast迭代器,它仅仅需要在add(int, E),remove(int)方法(或者它重写的其他任何 会结构性修改这个列表的方法)中添加这个字段。调用一次add(int,E)或者remove(int)方法时必须且仅仅给这个字段加1,否则迭代器会抛出伪装的ConcurrentModificationExceptions错误。如果一个实现类 不希望提供fail-fast迭代器,则可以忽略这个字段。

image-20220311190539727

  1. expectedModCount初始值是modcount。
  2. hasnext的判断条件时cursor!=size,当前迭代位置不是数组的最大容量值就返回true。
  3. next和remove操作之前都会调用checkForComodification来检查expectedModCount和modcount是否相等。

如果没checkForComodification去检查expectedModCount与modCount相等,这个程序肯定会报越界异常

ArrayIndexOutOfBoundsException 因为有modCount的存在,在使用多线程对非线程安全的集合进行操作时,使用迭代器循环会产生modCount != expectedModCount的情况,会抛出异常。