亲宝软件园·资讯

展开

Kotlin遍历集合并发异常 Kotlin遍历集合导致并发修改异常的原因和解决办法

大王派来巡山的小旋风 人气:0
想了解Kotlin遍历集合导致并发修改异常的原因和解决办法的相关内容吗,大王派来巡山的小旋风在本文为您仔细讲解Kotlin遍历集合并发异常的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:kotlin遍历集合,kotlin语言教程,Kotlin遍及集合类型,下面大家一起来学习吧。

各位android 老司机们,对于android 遍历结合的时候,发生并发修改异常一定毫不陌生;

之前看到过一篇文章,

在阿里巴巴Java开发手册中,有这样一条规定:

其实,增强for循环也是Java给我们提供的一个语法糖,如果将以上代码编译后的class文件进行反编译(使用jad工具)的话,可以得到以下代码:

1、原因:(其实我都不想在各位老司机面前再赘述这个了。-_-||)

这个异常产生的原因是,迭代器依赖于集合而存在,在判断成功后,集合中添加了新的元素,而迭代器并不知道,所有就报错了。其实这个问题说的是:迭代器遍历集合中的元素的时候,不要使用集合对象去修改集合中的元素。

翻看ArrayList源码和iterator()方法的具体实现,可以发现ArrayList继承于集合抽象类有一个成员变量modCount,在每次对元素进行增删改时,相应方法会将modCount++。而进行遍历iterator的next方法中首先会调用checkForComodification()方法,这个方法会对modCount和expectedModCount进行比较,expectedModCount是iterator的成员变量,一开始被赋值为modCount,两者不等就会抛出并发修改的异常。

解决方案:迭代器遍历的时候,可以通过迭代器修改集合中的元素,iterator类中也有修改元素的方法,并在修改完成后重新将modCount赋值给expectedModCount,之后进行next遍历检查就不会再报异常。

2、解决方法:

1、直接使用普通for循环进行操作

用for 循环遍历,然后直接用list 操作,eg:

2、foreach,或者Iterator 遍历的,直接用Iterator 来操作

3、问题复现

那么说了这多,其实就是mapIndexed 这个方法,这个语法糖其实是基于Iterator来遍历的。

所以,如果你要是在使用这个方式遍历的过程中从集合中remove元素,那就会有并发修改异常产生 ;

我还是贪图Kotlin 高级用法的甜头,而忽视了细节,导致问题出现,粗心大意,理解不深害死人。。

总结

加载全部内容

相关教程
猜你喜欢
用户评论