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 高級用法的甜頭,而忽視瞭細節,導致問題出現,粗心大意,理解不深害死人。。

總結

到此這篇關於Kotlin遍歷集合導致並發修改異常的原因和解決方法的文章就介紹到這瞭,更多相關Kotlin遍歷集合並發異常內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: