簡體   English   中英

Java List和遞歸導致並發修改異常

[英]Java List and recursion leads to Concurrent Modification Exception

以下函數以遞歸方式遍歷列表並將其除以一半,並對子列表執行某些操作。 如果列表大小為2,則遞歸會中斷。我知道如果在迭代它時更改列表,則會發生並發修改異常。 但我不使用迭代,它仍然會發生:

    private static List<ParticipantSlot> divide(List<ParticipantSlot> list) {
        int n = list.size();

        //do something 

        if (n>2){
            List<ParticipantSlot> l = divide(list.subList(0, n/2-1));
            List<ParticipantSlot> r= divide(list.subList(n/2, n));

            l.addAll(r);
            return l;
        }else{
            return list;
        }
    }

您正在使用addAll() ,它將迭代您在參數中提供的集合。 現在, subList僅將視圖返回到原始列表,因此您嘗試將值添加到原始列表的視圖中,並同時迭代原始列表的不同部分。 砰。

如果你每次創建一個子列表的副本 ,它應該工作 - 雖然它效率很低。

您會收到並發修改異常,因為子列表由原始列表支持:

返回的列表由此列表支持,因此返回列表中的非結構更改將反映在此列表中,反之亦然。 返回的列表支持此列表支持的所有可選列表操作。

如果您想避免異常,請在修改之前復制第一個子列表。

如果您使用的是ArrayList,則可能需要將其更改為CopyOnWriteArrayListConcurrentLinkedQueue

如果您處於多線程環境中,則需要在Array周圍進行synchronized

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM