【问题标题】:ConcurrentModificationException is not thrown in DVM for 1 list member1 个列表成员的 DVM 中未引发 ConcurrentModificationException
【发布时间】:2014-03-07 09:17:26
【问题描述】:

以下代码在 JVM 中崩溃(并发修改异常)但在 DVM 中没有,我无法理解为什么它在 andorid 中没有崩溃。我正在使用JB

    List<String> list = new ArrayList<String>();
    list.add("Something");//add only 1 object

    for(String a:list){
        list.remove(a);
    }

【问题讨论】:

  • JVM 崩溃的事实是显而易见的:使用迭代器从集合中删除一个元素,同时对其进行迭代。迭代器的实现可能在 DVM 上有所不同。也就是说,使用迭代器,它对两者都有效。
  • 我理解它在 DVM 上的不同行为,但不明白为什么会这样!虽然 fail-fast 依赖于 JVM,但我仍然希望它是基本行为

标签: java android exception concurrentmodification


【解决方案1】:

您正在迭代列表并尝试从同一列表中删除值。这会导致异常。尝试将要删除的项目添加到单独的列表中,并在迭代后使用 List.removeall() 函数删除所有不需要的值。

示例:

List<String> removeList = new ArrayList<String>();
for(String a:list) {
removeList.add(a);
}

list.removeAll(removeList);

【讨论】:

  • 问题完全不同。他想知道为什么它不会在 android 中崩溃?
【解决方案2】:

嗨,是的,它会给出一个例外

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at coffee.CoffeeApp.main(CoffeeApp.java:20)
Java Result: 1

因为

快速失败行为是通过保持修改计数来实现的,如果迭代线程意识到修改计数发生变化,它会抛出 ConcurrentModificationException。

所以做这样的事情并在迭代器的帮助下迭代列表

List<String> list = new ArrayList<String>();
list.add("Something");//add only 1 object

Iterator<String> it = list.iterator();
while(it.hasNext()) {
    it.next();
    it.remove();
    //Do something with obj
}

我们可以说的是无法保证迭代器的快速失败行为,这里存在不同步的并发修改。快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。因此,快速失败的迭代器一旦意识到自迭代开始以来 Collection 的结构已被修改,就会失败,如果迭代器线程实现了修改,则抛出 ConcurrentModificationException。更改可以是添加、更新或删除。

在 android 中可能是在不同的实现下,所以没有问题。

比较研究请访问,但是我在这里没有很好的研发

http://www.docjar.com/html/api/java/util/ArrayList.java.html

v/s

https://android.googlesource.com/platform/libcore/+/f33eae7e84eb6d3b0f4e86b59605bb3de73009f3/luni/src/main/java/java/util/ArrayList.java

【讨论】:

  • 问题完全不同。他想知道为什么它不会在 android 中崩溃?
  • @Shaan,我要更新了,请稍等!!
【解决方案3】:

当您迭代列表(或任何集合,就此而言)时,您只能通过相同的迭代器修改列表。所以这会起作用:

for(Iterator<String> listIter = list.iterator(); listIter.hasNext();) {
    listIter.next().remove();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2023-04-08
    相关资源
    最近更新 更多