首页 >Java >java教程 >迭代和修改 Java 列表时如何避免 ConcurrentModificationException?

迭代和修改 Java 列表时如何避免 ConcurrentModificationException?

DDD
DDD原创
2024-11-29 13:25:11569浏览

How Can I Avoid ConcurrentModificationException When Iterating and Modifying a Java List?

理解 Java 中的并发修改异常

当多个线程并发修改可变集合时会发生 ConcurrentModificationException,通常会违反其内部一致性。为了说明这个概念,让我们分析遇到此异常的代码片段。

import java.util.*;

public class ConcurrentModificationExample {

    public static void main(String[] args) {
        List<String> s = new ArrayList<>();
        ListIterator<String> it = s.listIterator();

        for (String a : args)
            s.add(a);

        if (it.hasNext())
            String item = it.next();

        System.out.println(s);
    }
}

此代码尝试在向列表添加元素时迭代列表。但是,由于 ListIterator 是在添加元素之前创建的,因此会引发异常。

为了避免此错误,我们可以修改代码如下:

import java.util.*;

public class ConcurrentModificationExample {

    public static void main(String[] args) {
        List<String> s = new ArrayList<>();

        for(String a : args)
            s.add(a);

        ListIterator<String> it = s.listIterator();    
        if(it.hasNext()) {  
            String item = it.next();   
        }  

        System.out.println(s);

    }
}

在修改后的代码中,列表迭代器在元素添加到列表后创建,以确保一致性。 ListIterator 允许在迭代期间修改列表,但至关重要的是它是在列表初始化之后创建的,并且在创建和使用之间不能修改。这可确保列表在整个迭代过程中保持有效状态。

以上是迭代和修改 Java 列表时如何避免 ConcurrentModificationException?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn