最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析

 更新時(shí)間:2023年12月14日 11:40:13   作者:原來是小袁吶  
這篇文章主要為大家介紹了ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

一、使用背景

在阿里巴巴開發(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)文章

最新評(píng)論

化隆| 绥阳县| 揭阳市| 繁昌县| 阳江市| 湘乡市| 望江县| 拜泉县| 上杭县| 太谷县| 凤山市| 江北区| 吴川市| 瑞安市| 铁岭市| 尉犁县| 清远市| 陵川县| 色达县| 济阳县| 藁城市| 惠来县| 饶阳县| 贺州市| 衡水市| 衡阳市| 恭城| 吴川市| 故城县| 长宁县| 响水县| 陇西县| 东宁县| 成都市| 吴忠市| 龙游县| 肇庆市| 金塔县| 建湖县| 胶南市| 武穴市|