【发布时间】:2013-10-01 07:38:17
【问题描述】:
ITSPoI allowedPoi = j.next() 行在执行allowedPoIs.remove(k) 后提供以下错误:
java.util.ConcurrentModificationException 在 java.util.ArrayList$Itr.checkForComodification(Unknown Source)
private Map<String,Integer> findClosest(Route tempRoute, List<ITSPoI> allowedPoIs, List<ITSPoI> tabulist) {
double cost,mincost = 999999999;
Map<String,Integer> closest = new HashMap<String,Integer>();
for (int i=0; i<tempRoute.getPOIs().size(); i++) {
int k = 0;
for(Iterator<ITSPoI> j = allowedPoIs.iterator(); j.hasNext(); ) {
ITSPoI allowedPoi = j.next();
if (!intabu(allowedPoi,tabulist))
{
try
{
cost = _cvrtw.getCostMatrix().getCost(tempRoute.getPOI(i).getNodeId(),allowedPoi.getNodeId());
if (cost<mincost){
mincost = cost;
closest.put("index",i);
closest.put("poi",k);
allowedPoIs.remove(k);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
k++;
}
}
return closest;
}
【问题讨论】:
-
通常不允许一个线程在另一个线程对其进行迭代时修改 Collection。
-
@Ashok - 或者当 同一个线程 对其进行迭代时,这是一个更常见的问题(也是这里的问题)。
-
足以将
Array替换为Vector或List myList = Collections.synchronizedList (myList);