为什么迭代器不是CuncurentModificationException的解决方案?

时间:2014-12-15 14:37:16

标签: java multithreading arraylist listiterator

我想避免同步,所以我尝试使用迭代器。我修改数组的唯一地方如下:

    if (lastSegment.trackpoints.size() > maxPoints)
    {
        ListIterator<TrackPoint> points = lastSegment.trackpoints.listIterator();
        points.next();
        points.remove();
    }
    ListIterator<TrackPoint> points = lastSegment.trackpoints.listIterator(lastSegment.trackpoints.size());
    points.add(lastTrackPoint);

数组遍历如下所示:

    for (Iterator<Track.TrackSegment> segments = track.getSegments().iterator(); segments.hasNext();)
    {
        Track.TrackSegment segment = segments.next();
        for (Iterator<Track.TrackPoint> points = segment.getPoints().iterator(); points.hasNext();)
        {
            Track.TrackPoint tp = points.next();
            //                    ^^^ HERE I GET ConcurentModificationException
            //                    =============================================
            ...
        }
    }

那么,迭代器有什么问题?二级数组是巨大的,所以我不想复制它们,也不想依赖我的Track类之外的同步。

1 个答案:

答案 0 :(得分:1)

来自https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

  

例如,一个线程通常不允许修改Collection而另一个线程正在迭代它。通常,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。

您需要自己实现某种同步以避免异常。您可以考虑使用Collections.synchronizedList并仅通过该视图操作列表。