迭代外星人名单

时间:2016-02-09 16:15:45

标签: java arraylist concurrency

假设我有一个由任意方法返回的列表:

List<E> someList = someObject.getList();

someList可以随时由另一个帖子中的someObject更改。我无法访问someObject的实现,someObject.getList()不返回同步或不可变列表实现。

我想要遍历someList。不幸的是,由于列表可以更改,迭代它通常不起作用:

// Sometimes throws ConcurrentModificationException
for(E element : someObject.getList()) {
    doSomething(element);
    // ...
}

那么如何迭代外来方法返回的列表(而不是线程安全)?

1 个答案:

答案 0 :(得分:1)

也许其他线程使用像synchronized(list)这样的同步机制来修改列表;在这种情况下,您可以在同一个对象上使用synchronized,这样您就可以安全了。

List<E> list=someobject.getList();
synchronized (list) {
   for (E element : list) {
        doSomething(element);
   }
}

您可以尝试在列表或someObject上进行同步,并希望它可以正常工作。

除此之外,我没有看到任何干净的解决方案。 最后,如果修改列表的其他代码不关心列表中的其他用户,则安全迭代是不可能的。

Unclean one:尝试在循环中复制数组,直到不再抛出ConcurrentModificationException为止。