迭代外星人名单

kon*_*las 7 java concurrency arraylist

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

List<E> someList = someObject.getList();
Run Code Online (Sandbox Code Playgroud)

someList可以someObject在另一个线程中随时更改.我无权访问someObject,并且someObject.getList()不返回同步或不可变列表实现.

我想迭代someList.不幸的是,由于列表可以更改,通过迭代通常不起作用:

// Sometimes throws ConcurrentModificationException
for(E element : someObject.getList()) {
    doSomething(element);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*scu 1

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

List<E> list=someobject.getList();
synchronized (list) {
   for (E element : list) {
        doSomething(element);
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以尝试在列表或某个对象上进行同步,并希望它能起作用。

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

不干净的一种:尝试在循环中复制数组,直到不再抛出 ConcurrentModificationException 为止。