ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析
一、使用背景
在阿里巴巴開發(fā)手冊(cè)中,有這樣一條規(guī)定:不要在foreach循環(huán)里進(jìn)行add和remove操作(這里指的是List的add和remove操作),
否則會(huì)拋出ConcurrentModificationException。remove元素請(qǐng)使用iterator。

二、源碼
1.我們知道foreach是語法糖,他本質(zhì)還是iterator進(jìn)行的循環(huán),因此下面的代碼和使用foreach循環(huán)是一樣的。
在循環(huán)里面我們使用“錯(cuò)誤”操作,使用List的add方法進(jìn)行操作,會(huì)拋出ConcurrentModificationException
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("apple");
Iterator<String> iterator = arrayList.iterator();
while(iterator.hasNext()){
String value = iterator.next();
if("apple".equals(value)){
arrayList.add("orange");
}
}三、源碼解析
1.arrayList.iterator();
①返回Itr類,并將modcount的值賦值給一個(gè)變量expectedModCount,其中modcount表示List實(shí)際被增刪的次數(shù),expectedModCount表示該迭代器期望被增刪的次數(shù),當(dāng)新建Itr類的時(shí)候會(huì)給他賦初始值,只有通過該迭代器進(jìn)行值的增刪才會(huì)修改該值


2.iterator.next();
①在調(diào)用迭代器的next方法時(shí),他會(huì)進(jìn)行檢查,比較modCount和expectedModCount的值,如果不相等,Concurrent


總結(jié)
1.modCount和expectedModeCount不一致才會(huì)拋出ConcurrentModificationException。當(dāng)我們調(diào)用List的remove方法時(shí),他只會(huì)修改modCount的值;當(dāng)我們調(diào)用iterator的remove方法,他會(huì)將modCount的值賦值給expectedModeCount
2.modCount和expectedModeCount是屬于fast-fail機(jī)制,用于多線程中,當(dāng)進(jìn)行遍歷的時(shí)候,有其他線程修改值的時(shí)候就會(huì)進(jìn)行檢查
解決方法
- 1.使用普通for循環(huán)進(jìn)行操作
- 2.在循環(huán)中使用iterator進(jìn)行操作
- 3.使用stream流進(jìn)行過濾
- 4.使用fast-saft安全的類,如ConCurrentLinkedQueue
以上就是ArrayList foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析的詳細(xì)內(nèi)容,更多關(guān)于ArrayList foreach循環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼,需要的朋友可以參考下2019-10-10
spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題
本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
mybatisPlus自動(dòng)填充更新時(shí)間的示例代碼
本文主要介紹了mybatisPlus自動(dòng)填充更新時(shí)間,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
教你使用idea搭建ssm詳細(xì)教程(Spring+Spring Mvc+Mybatis)
今天教大家使用idea搭建ssm詳細(xì)教程(Spring+Spring Mvc+Mybatis),文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)正在學(xué)習(xí)使用idea的小伙伴很有幫助,需要的朋友可以參考下2021-05-05
Java啟動(dòng)時(shí)循環(huán)依賴處理方式
解決Spring Boot啟動(dòng)時(shí)由于SwaggerAutoConfiguration注解重復(fù)啟用導(dǎo)致的循環(huán)導(dǎo)入問題,通過排除SwaggerAutoConfiguration并手動(dòng)開啟Swagger配置2026-01-01
MyBatis配置文件解析與MyBatis實(shí)例演示
這篇文章主要介紹了MyBatis配置文件解析與MyBatis實(shí)例演示以及怎樣編譯安裝MyBatis,需要的朋友可以參考下2022-04-04

