快速失败(fail-fast)和安全失败(fail-safe)
2019-02-18 本文已影响0人
秋笙fine
Iterator的安全失败(fail-safe)是基于对底层集合进行拷贝,所以在多线程情况下,对java.util包下的集合类进行修改是会抛出ConcurrentModificationException,而对JUC包下的安全失败集合进行修改,是不会影响原来数据的,因为其迭代器是对集合进行的拷贝。
fail-fast原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量。集合如果在遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hasNext/next遍历下一个元素之前,都会检测modCount变量是否为exceptedmodCount值,是的话就返回遍历,否则抛出异常,中止遍历(CAS应用)。
(java。util包下的类)
(以下是JUC并发包下的类)
fail-safe:在遍历时候不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
缺点:迭代器并不能访问到修改后的内容。即迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改,迭代器是不知道的。(无法保证可见性)