fail-fast和fail-safe的异同

what:

  fail-fast:在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。

  fail-safe:在迭代器遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历

 

how:

  fail-fast:

    原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常终止遍历。

    注意:异常的抛出条件是检测到“ modCount!=expectedmodCount ”这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测“并发修改的bug”。

    场景:java.util包下的基础集合类(map/set/list)都是快速失败的(concurrent包中不是的),不能在多线程下发生并发修改(迭代过程中被修改)。

 

 

 

 

  fail-safe:

    原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中,对原集合所作的修改不能被迭代器检测到,所以不会触发Concurrent Modification Exception。

    缺点:迭代器并不能访问到修改后的内容。

posted @ 2022-06-01 10:44  修心而结网  阅读(53)  评论(0编辑  收藏  举报