假设我有一个由任意方法返回的列表:
List<E> someList = someObject.getList();
someList
可以随时由另一个帖子中的someObject
更改。我无法访问someObject
的实现,someObject.getList()
不返回同步或不可变列表实现。
我想要遍历someList
。不幸的是,由于列表可以更改,迭代它通常不起作用:
// Sometimes throws ConcurrentModificationException
for(E element : someObject.getList()) {
doSomething(element);
// ...
}
那么如何迭代外来方法返回的列表(而不是线程安全)?
答案 0 :(得分:1)
也许其他线程使用像synchronized(list)这样的同步机制来修改列表;在这种情况下,您可以在同一个对象上使用synchronized,这样您就可以安全了。
List<E> list=someobject.getList();
synchronized (list) {
for (E element : list) {
doSomething(element);
}
}
您可以尝试在列表或someObject上进行同步,并希望它可以正常工作。
除此之外,我没有看到任何干净的解决方案。 最后,如果修改列表的其他代码不关心列表中的其他用户,则安全迭代是不可能的。
Unclean one:尝试在循环中复制数组,直到不再抛出ConcurrentModificationException为止。