设为首页 加入收藏

TOP

【Java深入研究】4、fail-fast机制(四)
2017-10-13 10:03:49 】 浏览:8404
Tags:Java 深入 研究 fail-fast 机制
bsp; 
  •     at java.util.ArrayList$Itr.next(Unknown Source)  
  •     at test.ArrayListTest$threadOne.run(ArrayListTest.java:23)  
  •  

    二、fail-fast产生原因

            通过上面的示例和讲解,我初步知道fail-fast产生的原因就在于程序在对 collection 进行迭代时,某个线程对该 collection 在结构上对其做了修改,这时迭代器就会抛出 ConcurrentModificationException 异常信息,从而产生 fail-fast。

            要了解fail-fast机制,我们首先要对ConcurrentModificationException 异常有所了解。当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常。同时需要注意的是,该异常不会始终指出对象已经由不同线程并发修改,如果单线程违反了规则,同样也有可能会抛出改异常。

            诚然,迭代器的快速失败行为无法得到保证,它不能保证一定会出现该错误,但是快速失败操作会尽最大努力抛出ConcurrentModificationException异常,所以因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。下面我将以ArrayList为例进一步分析fail-fast产生的原因。

    从前面我们知道fail-fast是在操作迭代器时产生的。现在我们来看看ArrayList中迭代器的源代码:

     

    [java]  view plain  copy
     
    1. private class Itr implements Iterator<E> {  
    2.         int cursor;  
    3.         int lastRet = -1;  
    4.         int expectedModCount = ArrayList.this.modCount;  
    5.   
    6.         public boolean hasNext() {  
    7.             return (this.cursor != ArrayList.this.size);  
    8.         }  
    9.   
    10.         public E next() {  
    11.             checkForComodification();  
    12.             /** 省略此处代码 */  
    13.         }  
    14.   
    15.         public void remove() {  
    16.             if (this.lastRet < 0)  
    17.                 throw new IllegalStateException();  
    18.             checkForComodification();  
    19.             /** 省略此处代码 */  
    20.         }  
    21.   
    22.         final void checkForComodification() {  
    23.             if (ArrayList.this.modCount == this.expectedModCount)  
    24.        &nb
    首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/7/7
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇【算法】1、快速排序 下一篇【Java深入研究】4、fail-fast机制

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目