Java 中的fail safe和fail fast迭代器是什么

Java Collections 支持两种类型的迭代器:fail-safe(故障安全) 和 fail fast(快速失败)。快速失败迭代器和故障安全迭代器之间的主要区别在于底层集合在开始迭代时是否可以修改。如果您使用过像 ArrayList 这样的 Collection,那么您就会知道,当您迭代遍历它们时,其他线程不应修改该集合。如果迭代器在迭代开始后检测到任何结构更改,例如添加或删除新元素,则会抛出ConcurrentModificationException,这称为快速失败行为,这些迭代器称为快速失败迭代器,因为它们一旦检测到任何修改就会失败。

尽管当多个线程同时修改迭代器时,迭代器不一定会抛出此异常。即使在单线程中,当您使用 ArrayList 的 remove() 方法而不是 Iterator 的 remove() 方法来删​​除元素时,也可能会发生这种情况.

Java 1.4 中的大多数 Collection 类(例如Vector、ArrayList、HashMap、 HashSet )都具有fail-fast迭代器。另一种类型的迭代器是在 Java 1.5 中引入并发集合类时引入的。

这种迭代器使用原始集合的视图进行迭代,因此即使在迭代开始后修改了原始集合,也不会抛出 ConcurrentModificationException。

这意味着您可以迭代并使用过时的值,但这是您需要为fail-safe迭代器支付的成本.

Java 中fail-safe 迭代器和fail-fast迭代器的区别

为了更好地理解这两种迭代器之间的区别,本文中的案例使用 ArrayList 等传统集合和 CopyOnWriteArrayList 等并发集合的示例。尽管如此,让我们先逐一看看这两种迭代器的一些关键区别:

1)fail-fast迭代器在迭代过程中一旦检测到集合中的任何结构变化就会抛出ConcurrentModfiicationException ,这基本上改变了迭代器保存的 modCount 变量。 虽然快速失败迭代器不会抛出 CME。

  1. Fail-fast迭代器遍历原始集合类,而fail-safe迭代器遍历原始集合的副本或视图。这就是为什么他们没有检测到原始集合类的任何更改,这也意味着您可以使用陈旧的值进行操作。

  2. Java 1.4 集合类(如 ArrayList、HashSet 和 Vector)中的迭代器是快速失败的,而并发集合类(如 CopyOnWriteArrayList或CopyOnWriteArraySet返回的迭代器是失败安全的。

  3. 在 Java 中,同步集合返回的迭代器是快速失败的,而并发集合返回的迭代器是fail-safe的。

  4. Fail fast迭代器在实时数据中工作,但在数据修改时变得无效,而Fail fast迭代器始终保持一致。

何时使用快速失败和fail-safe迭代器

当你不担心集合在迭代过程中被修改时,请使用fail-safe 迭代器,因为fail-fast 迭代器不允许这样做。遗憾的是,你无法选择fail-safe 迭代器或fail-fast迭代器,这取决于你使用的是哪个集合类。

JDK 1.4 中的大多数集合(如 HashSet、Vector 和 ArrayList)都有fail-fast 迭代器,只有 JDK 1.5 中引入的并发集合(如 CopyOnWriteArrayList 和 CopyOnWriteArraySet)支持fail-safe迭代。

此外,如果要在迭代过程中删除元素,请使用迭代器的 remove() 方法,而不要使用 ArrayList 或 HashSet 等集合类提供的 remove 方法,因为这将导致 ConcurrentModificationException 异常。

总结

这就是 Java 中的 fail-safe迭代器和 fail-fast迭代器之间的区别。现在您知道,当通过添加或删除任何对象来修改基础集合类时,这只是两种行为不同的迭代器。

相关推荐
讳疾忌医丶19 分钟前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
郑州光合科技余经理42 分钟前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼43 分钟前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
梦想平凡1 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
sunshine22 girl2 小时前
Idea中如何搜索
java·ide·intellij-idea
猫吻鱼3 小时前
【AI 01】【Spring AI 基础使用】
java·spring·spring ai
梨涡泥窝3 小时前
基于SSM的校园二手交易平台的设计与实现
java·tomcat
许彰午3 小时前
44-useRowSet镜像实现
java·低代码·架构
bamboolm4 小时前
springboot+Ollama整合
java·ollama
我不会起名字3224 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣