对于1个列表成员,DVM中不会引发ConcurrentModificationException

时间:2014-03-07 09:17:27

标签: java android exception concurrentmodification

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

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

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

3 个答案:

答案 0 :(得分:1)

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

样品:

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

list.removeAll(removeList);

答案 1 :(得分:1)

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

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。

所以做这样的事情并在Iterator

的帮助下迭代列表
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中可能会有不同的实现,所以没有问题。

对于比较研究,请访问,但我没有一个伟大的R&amp; D这里

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

答案 2 :(得分:0)

当您迭代List(或任何Collection,就此而言)时,您只能通过完全相同的Iterator修改List。所以这将有效:

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