美文网首页
深入理解java集合框架(java.util.Concurren

深入理解java集合框架(java.util.Concurren

作者: Aolus | 来源:发表于2017-08-18 14:37 被阅读0次

    异常产生

    当我们迭代一个ArrayList或者HashMap或者set时,如果尝试对集合做一些修改操作(例如删除元素(大多数为删除)新增),可能会抛出java.util.ConcurrentModificationException的异常。

    以上这段简单的代码,在很多人看来不应该有问题,为什么会出异常呢,也许很多人想不通,下面我来具体解释下:

    异常原因

    ArrayList的父类AbstarctList中有一个域modCount,每次对集合进行修改(增添元素,删除元素……)时都会modCount++

    而foreach的背后实现原理其实就是Iterator(关于Iterator可以看Java Design Pattern: Iterator),等同于注释部分代码。在这里,迭代ArrayList的Iterator中有一个变量expectedModCount,该变量会初始化和modCount相等,但如果接下来如果集合进行修改modCount改变,就会造成expectedModCount!=modCount,此时就会抛出java.util.ConcurrentModificationException异常

    过程如下图:

    分析jdk源码得知如下:

    异常是这个方法抛出的,在获取元素的时候,默认会去检查modCount和expectModCount 是否相等不等抛出异常

    解决办法:

    使用iterator 进行遍历,以及相关删除,增加操作

    相关文章

      网友评论

          本文标题:深入理解java集合框架(java.util.Concurren

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