当前位置: 首页 > 面试题库 >

CopyOnWriteArrayList抛出CurrentModificationException

孟子墨
2023-03-14
问题内容

ConcurrentModificationException当我遍历列表时,偶尔会得到一个。Google搜索通知我,这可能是因为我在迭代该列表时正在另一个线程中更改该列表,并且要使此问题消失,我应该使用java.util.concurrent.CopyOnWriteArrayList…。

…除了我已经是。

显然,我在某处正在做一些 非常 愚蠢的事情。

是否有人对如何引发CopyOnWriteArrayList抛掷物有任何见识ConcurrentModificationException?如果有关系,我正在使用Java
5。

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

  • 在前面添加元素。(list.add(0, newElement);
  • 使用subList让较旧的项目掉下来。(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似乎暗示着我的呼吁subList是问题的根源。我仍然想了解为什么。

编辑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
  }
}


 类似资料:
  • 主要内容:1 CopyOnWriteArrayList的概述,1.1 写时复制,2 CopyOnWriteArrayList的原理,2.1 基本结构,2.2 构造器,2.3 写操作,2.4 读操作,3 CopyOnWriteArrayList的总结基于JDK1.8详细介绍了CopyOnWriteArrayList的底层源码实现,包括写操作、读操作、迭代操作等,并介绍了写时复制(COW)机制的原理。 1 CopyOnWriteArrayList的概述 public class CopyOnWrit

  • 问题内容: 我想排序CopyOnWriteArrayList。但是当我尝试运行以下代码时 它在扔unsorted operation exception。 提前致谢。 问题答案: 但是CopyOnWriteArrayList的ListIterator不支持remove,set或add方法。 解决方法:

  • 本文向大家介绍Java中的CopyOnWriteArrayList类,包括了Java中的CopyOnWriteArrayList类的使用技巧和注意事项,需要的朋友参考一下 类声明 CopyOnWriteArrayList是ArrayList的线程安全变体,其中可以更改ArrayList的操作(添加,更新,设置方法)创建基础数组的克隆。 CopyOnWriteArrayList将在基于线程的环境中使

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 当我尝试使用迭代器从CopyOnWriteArrayList删除元素时,出现异常。我注意到它已记录在案 不支持对迭代器本身进行元素更改操作(删除,设置和添加)。这些方法抛出UnsupportedOperationException。 (来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWr

  • 主要内容:文章目录,1.CopyOnWriteArrayList,2.CopyOnWriteArraySetCopyOnWrite的意思是,简单的说就是在对容器操作时,不是直接进行操作,而是先将容器复制一份,对新的容器操作后,再用新的容器覆盖原来的容器。 CopyOnWrite可以实现并发读操作,因为容器的写操作不会读当前容器造成影响。 CopyOnWrite的,不然n个写操作就会有n个容器副本,并且这n个副本会进行覆盖,最终只有1个副本的操作生效。 CopyOnWrite可以保证数据的,但是无