首页 > 试题广场 >

快速失败(fail-fast)和安全失败(fail-safe

[问答题]
请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?
快速失败,在对集合进行遍历的时候,如果a线程正在对集合进行遍历,而b线程对集合进行修改,那么a线程将会抛出异常。因为快速失败是在原来的集合上直接访问集合内容,在遍历下一个元素之前会对比原来的内容与现在的内容是否相同,相同则返回遍历。抛出异常则终止遍历。 安全失败,先复制原有集合内容,在拷贝的集合上进行遍历,在遍历过程中对原集合所做的修改不能被迭代器检测到,故不会抛出异常
发表于 2019-02-21 11:57:27 回复(1)
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
发表于 2019-05-05 15:14:34 回复(0)