草庐IT

java - ConcurrentModificationException 尽管使用同步

coder 2023-08-28 原文

 public synchronized X getAnotherX(){ 
  if(iterator.hasNext()){
   X b = iterator.next();
   String name = b.getInputFileName();
  ...
   return b;
  }
  else{return null;}
 }

尽管声明 header 中有同步语句,但在我使用 iterator.next(); 的那一行我仍然得到一个 ConcurrentModificationException 异常;这里有什么问题吗?

最佳答案

ConcurrentModificationException 通常与多线程无关。大多数情况下,它的发生是因为您正在修改它在迭代循环体内迭代的集合。例如,这会导致:

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
       collection.remove(item);
    }
}

在这种情况下,您必须改用iterator.remove() 方法。如果您要添加到集合中,这种情况同样会发生,在这种情况下没有通用的解决方案。但是,如果处理列表,则可以使用子类型 ListIterator,它有一个 add() 方法。

关于java - ConcurrentModificationException 尽管使用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1655362/

有关java - ConcurrentModificationException 尽管使用同步的更多相关文章

随机推荐