加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – CopyOnWriteArrayList throwing CurrentModificationExc

发布时间:2020-12-14 16:27:46 所属栏目:Java 来源:网络整理
导读:当我遍历一个列表时,我偶尔会得到一个ConcurrentModificationException异常. Google搜索通知我,这可能是因为我在另一个线程中改变了该列表,同时迭代它,并且使得这个问题消失,我应该使用 java.util.concurrent.CopyOnWriteArrayList …. 除了我已经 显然,我正
当我遍历一个列表时,我偶尔会得到一个ConcurrentModificationException异常. Google搜索通知我,这可能是因为我在另一个线程中改变了该列表,同时迭代它,并且使得这个问题消失,我应该使用 java.util.concurrent.CopyOnWriteArrayList ….

除了我已经

显然,我正在做某些真正愚蠢的地方.

有人有任何洞察力如何引发CopyOnWriteArrayList来抛出ConcurrentModificationException?如果重要,我使用Java 5.

编辑:由于我使用的mutator可能很重要,我以两种方式修改此列表:

>向前面添加元素(list.add(0,newElement);)
>使用子列表让较旧的项目从背面掉下来. (list = list.subList(0,MAX_LIST_SIZE);)

那些举起红旗吗如果是这样,为什么?我的理解是,由于这些操作首先复制了这些东西,任何现有的迭代器都会指向未修改的原件,因此不会在意.我知道有一个洞吗?

编辑2:导致问题的精确代码仍然有点暗淡,但我至少可以发布我看到的异常:

java.util.ConcurrentModificationException
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
    at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
    at....

…它指向我的代码中的for-each循环实例化.

COWSubList似乎暗示我对子列表的调用是我的问题的根源;我还是想明白为什么.

编辑3:* facepalm *

CopyOnWriteArrayList.subList()返回一个List而不是一个CopyOnWriteArrayList.返回的列表没有隐含的义务提供COWAL的任何保护.这使得使用这样的subList()来删除元素非常糟糕的想法.

不知道这是否是我的罪魁祸首,但它是可疑的,需要纠正.

解决方法

CopyOnWriteArrayList.subLists抛出ConcurrentModificationExceptions,如果包含列表从下面更改:
public class ListTest {

  private static List<int[]> intList;

  public static void main (String[] args) {
    CopyOnWriteArrayList<Integer> cowal = new CopyOnWriteArrayList<Integer>();
    cowal.add(1);
    cowal.add(2);
    cowal.add(3);

    List<Integer> sub = cowal.subList(1,2);
    cowal.add(4);
    sub.get(0); //throws ConcurrentModificationException
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读