欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、使用背景

在阿里巴巴開(kāi)發(fā)手冊(cè)中,有這樣一條規(guī)定:不要在foreach循環(huán)里進(jìn)行add和remove操作(這里指的是List的add和remove操作),

否則會(huì)拋出ConcurrentModificationException。remove元素請(qǐng)使用iterator。

二、源碼

1.我們知道foreach是語(yǔ)法糖,他本質(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類(lèi),并將modcount的值賦值給一個(gè)變量expectedModCount,其中modcount表示List實(shí)際被增刪的次數(shù),expectedModCount表示該迭代器期望被增刪的次數(shù),當(dāng)新建Itr類(lèi)的時(shí)候會(huì)給他賦初始值,只有通過(guò)該迭代器進(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)行過(guò)濾
  • 4.使用fast-saft安全的類(lèi),如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)文章

  • SpringMVC中RequestContextHolder獲取請(qǐng)求信息的方法

    SpringMVC中RequestContextHolder獲取請(qǐng)求信息的方法

    這篇文章主要介紹了SpringMVC中RequestContextHolder獲取請(qǐng)求信息的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java集合和數(shù)組的區(qū)別

    Java集合和數(shù)組的區(qū)別

    本文主要介紹了Java集合和數(shù)組的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java數(shù)組判斷是否越界的示例代碼

    Java數(shù)組判斷是否越界的示例代碼

    在Java編程中,避免數(shù)組越界是十分重要的,本文介紹了兩種常見(jiàn)的判斷數(shù)組是否越界的方法:一是通過(guò)數(shù)組的length屬性來(lái)判斷索引是否合法;二是通過(guò)捕獲ArrayIndexOutOfBoundsException異常來(lái)處理越界問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Spring Cloud Config解決的問(wèn)題和案例

    Spring Cloud Config解決的問(wèn)題和案例

    Spring Cloud Config 是 Spring Cloud 套件中的一個(gè)工具,提供了在分布式系統(tǒng)中對(duì)外部化配置的服務(wù)器端和客戶端支持,本文介紹了Spring Cloud Config解決的問(wèn)題和案例,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Tomcat安裝配置及Eclipse配置詳解

    Tomcat安裝配置及Eclipse配置詳解

    給大家介紹一下Tomcat安裝配置及Eclipse配置的全部圖文過(guò)程,如果你對(duì)這個(gè)還有不明白,一起跟著小編學(xué)習(xí)下。
    2017-11-11
  • 淺談java常量池

    淺談java常量池

    下面小編就為大家?guī)?lái)一篇淺談java常量池。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Java圖片處理之獲取gif圖一幀圖片的兩種方法

    Java圖片處理之獲取gif圖一幀圖片的兩種方法

    這篇文章主要給大家介紹了關(guān)于Java圖片處理之獲取gif圖一幀圖片的兩種方法,分別是利用Java原生代碼和使用im4java調(diào)用ImageMagick來(lái)實(shí)現(xiàn),兩種方法都給出來(lái)示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-10-10
  • Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    在 Java 程序運(yùn)行時(shí),內(nèi)存的管理是影響程序性能的關(guān)鍵因素之一,Java 程序使用的內(nèi)存主要由兩部分組成:堆內(nèi)存和棧內(nèi)存,Java 提供了多個(gè)參數(shù)來(lái)控制堆內(nèi)存的大小,其中最常用的參數(shù)是 -Xms 和 -Xmx,本文將詳細(xì)介紹這些參數(shù),需要的朋友可以參考下
    2024-11-11
  • EL調(diào)用Java方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    EL調(diào)用Java方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    簡(jiǎn)單來(lái)說(shuō),我們?cè)谝粋€(gè)類(lèi)中的某個(gè)方法,可以使用EL進(jìn)行調(diào)用,這個(gè)能被EL表達(dá)式調(diào)用的方法稱之為EL函數(shù),但是這種方式必須滿足兩點(diǎn)要求,具體哪兩點(diǎn),大家可以參考下本文
    2017-07-07
  • 如何解決springboot自動(dòng)重啟問(wèn)題

    如何解決springboot自動(dòng)重啟問(wèn)題

    這篇文章主要介紹了如何解決springboot自動(dòng)重啟問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論