繁体   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