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)
那么如何迭代外来方法返回的列表(而不是线程安全)呢?
也许另一个线程使用像synchronized(list)这样的同步机制来修改列表;在这种情况下,您可以在同一个对象上使用同步,这样就安全了。
List<E> list=someobject.getList();
synchronized (list) {
for (E element : list) {
doSomething(element);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试在列表或某个对象上进行同步,并希望它能起作用。
除此之外,我没有看到任何干净的解决方案。最后,如果修改列表的其他代码不关心列表的其他用户,那么安全迭代几乎是不可能的。
不干净的一种:尝试在循环中复制数组,直到不再抛出 ConcurrentModificationException 为止。
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |