走进 JDK 之 ArrayList(二):modCount 的前世今生
2023-09-17 20:41:28
前世:数组的烦恼
ArrayList 是 Java 集合框架中一种动态大小的数组,用于存储对象。在 JDK 1.2 之前,ArrayList 只是一个普通的数组,每当需要添加或删除元素时,它都会进行昂贵的数组复制操作。
这种设计带来了性能问题,尤其是当数组频繁修改时。此外,数组的大小固定,这意味着当数组达到其容量时,ArrayList 必须重新分配一个更大的数组,这会进一步降低性能。
modCount 的诞生
为了解决这些问题,JDK 1.2 引入了 modCount 字段。modCount 是一个整数值,每当 ArrayList 进行结构修改(如添加、删除或清除元素)时,它就会递增。
通过跟踪结构修改,modCount 允许 ArrayList 检测并发修改。并发修改是指在迭代器正在遍历 ArrayList 时修改其内容的行为。
fail-fast 机制
ArrayList 使用 modCount 来实现其 fail-fast 机制。当迭代器被创建时,它会记录当前的 modCount 值。在迭代过程中,迭代器会定期检查 ArrayList 的 modCount 是否与创建时记录的 modCount 相同。
如果 modCount 不同,则表明 ArrayList 在迭代过程中被修改了。在这种情况下,迭代器会抛出 ConcurrentModificationException 异常,终止迭代。
这种 fail-fast 机制有助于防止因并发修改而导致的数据不一致或意外行为。通过及时检测并发修改,应用程序可以采取适当的措施,例如重新获取集合或尝试再次执行操作。
modCount 的使用
modCount 字段在 ArrayList 的内部类 Itr(用于遍历 ArrayList)中使用。当 Itr 被创建时,它会记录当前的 modCount。在每次迭代步骤中,Itr 都会检查 ArrayList 的 modCount 是否与创建时记录的 modCount 相同。
如果 modCount 不同,Itr 会抛出 ConcurrentModificationException 异常,终止迭代。这可以防止由于并发修改而导致的数据不一致或意外行为。
结论
modCount 字段是 ArrayList 类中一个至关重要的组件,它使 ArrayList 能够检测并发修改并实现 fail-fast 机制。通过跟踪结构修改,modCount 帮助确保集合的一致性并防止意外的并发修改异常。
理解 modCount 的作用对于编写健壮且线程安全的应用程序至关重要,这些应用程序可以处理并发修改并保持数据完整性。