Exception in thread "main" java.util.ConcurrentModificationException

本文介绍了一个常见的编程陷阱:在遍历ArrayList过程中对其进行修改导致的ConcurrentModificationException异常,并提出使用CopyOnWriteArrayList作为解决方案。
摘要由CSDN通过智能技术生成

public class TestArrayList {
  public static     ArrayList< String > arrayList = new ArrayList<String>();
       
       public TestArrayList(){
      this.arrayList.add("A");
      this.arrayList.add("B");
      this.arrayList.add("C");
      this.arrayList.add("D");
       }
       public static void main(String[] args){
      TestArrayList testArrayList = new TestArrayList();
      Iterator<String> iterator = arrayList.iterator(); 
    while(iterator.hasNext()){
      String string= iterator.next();
    arrayList.add("E");
    }
     
       }
}

执行以上代码会抛出java.util.ConcurrentModificationException错误。这是因为主线程在遍历list的时候,子线程在向list中添加元素.。

解决方法:将ArrayList替换为CopyOnWriteArrayList。因为CopyOnWriteArrayList类最大的特点就是,在对其实例进行修改操作(add/remove等)会新建一个数据并修改,修改完毕之后,再将原来的引用指向新的数组。这样,修改过程没有修改原来的数组。也就没有了ConcurrentModificationException错误。

     在java.util.concurrent包中,除了CopyOnWriteArrayList类,也还有这样一个类CopyOnWriteArraySet。CopyOnWriteArraySet的实现是完全基于CopyOnWriteArrayList的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值