美文网首页
Fail-fast快速报错

Fail-fast快速报错

作者: 小小少年Boy | 来源:发表于2018-06-13 20:41 被阅读0次

    Fail-fast快速报错:

    是指当有其他线程对一个容器(如ArrayList,HashMap)进行了结构性修改,另外一个线程在使用iterator进行迭代,那么这个迭代线程会抛出并发修改的异常ConcurrentModificationException。
    所谓结构性修改,是对原有容器的size造成影响的操作,如remove、add、clear操作等。

    fail-fast 机制,是一种错误检测机制。 它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生。
    产生 fail-fast 事件,是通过抛出 ConcurrentModificationException 异常来触发的。

    CopyOnWriteArrayList可以避免fail-fast。CopyOnWriteArrayList是线程安全的。

    出现问题

    ArrayList在迭代过程中,如果有其他线程对list进行了结构性修改

    private static List<String> list = new ArrayList<String>(); 
    

    替换为

    解决思路

    方案一:在遍历过程中所有涉及到改变modCount值得地方全部加上synchronized或者直接使用Collections.synchronizedList,这样就可以解决。但是不推荐,因为增删造成的同步锁可能会阻塞遍历操作。

    方案二:使用CopyOnWriteArrayList来替换ArrayList。

    CopyOnWriteArrayList所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。

    该类产生的开销比较大,但是在两种情况下,它非常适合使用。1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。2:当遍历操作的数量大大超过可变操作的数量时。

    CopyOnWriterArrayList根本就不会产生ConcurrentModificationException异常,也就是它使用迭代器完全不会产生fail-fast机制。

    private static List<String> list = new CopyOnWriteArrayList<String>();
    

    java fail-fast机制详解
    https://blog.csdn.net/xiaotaode2012/article/details/39777797

    关于快速报错fail-fast想说的之fail-fast的实现原理(一)
    https://blog.csdn.net/fan2012huan/article/details/51076970

    关于快速报错fail-fast想说的之fail-fast的避免方法(二)
    https://blog.csdn.net/fan2012huan/article/details/51084297


    Boy-20180613

    相关文章

      网友评论

          本文标题:Fail-fast快速报错

          本文链接:https://www.haomeiwen.com/subject/ausseftx.html