我想避免同步,所以我尝试使用迭代器。我修改数组的唯一地方如下:
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
类之外的同步。
答案 0 :(得分:1)
来自https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
例如,一个线程通常不允许修改Collection而另一个线程正在迭代它。通常,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。
您需要自己实现某种同步以避免异常。您可以考虑使用Collections.synchronizedList
并仅通过该视图操作列表。