CopyOnWriteArrayList 你了解多少?,android开发模式

本文详细探讨了CopyOnWriteArrayList在Java并发编程中的特性,通过实例展示了其在Android开发中的使用,解释了为何在并发修改时ArrayList会抛出ConcurrentModificationException异常,而CopyOnWriteArrayList则能避免此类问题。文章还对比了CopyOnWriteArrayList与ArrayList、Vector的区别,并分析了CopyOnWriteArrayList的添加、移除和查询元素的实现原理。
摘要由CSDN通过智能技术生成

list.remove(item);

}

}

System.out.println(“通过对象移除后的list元素:”+ list.toString());

}

执行结果内容如下:

原始list元素:[1, 2, 1]

Exception in thread “main” java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)

at java.util.ArrayList$Itr.next(ArrayList.java:859)

at com.example.container.a.TestList.main(TestList.java:16)

很遗憾,结果并没有达到我们想要的预期效果,执行之后直接报错!抛ConcurrentModificationException异常!

为啥会抛这个异常呢?

我们一起来看看,foreach写法实际上是对List.iterator() 迭代器的一种简写,因此我们可以从分析List.iterator() 迭代器进行入手,看看为啥会抛这个异常。

ArrayList类中的Iterator迭代器实现,源码内容:

通过代码我们发现 Itr 是 ArrayList 中定义的一个私有内部类,每次调用nextremove方法时,都会调用checkForComodification方法,源码如下:

/*修改次数检查/

final void checkForComodification() {

//检查List中的修改次数是否与迭代器类中的修改次数相等

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

checkForComodification方法,实际上是用来检查List中的修改次数modCount是否与迭代器类中的修改次数expectedModCount相等,如果不相等,就会抛出ConcurrentModificationException异常!

那么问题基本上已经清晰了,上面的运行结果之所以会抛出这个异常,就是因为List中的修改次数modCount与迭代器类中的修改次数expectedModCount不相同造成的!

阅读过集合源码的朋友,可能想起Vector这个类,它不是 JDK 中 ArrayList 线程安全的一个版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值