我偶尔会得到一个ConcurrentModificationException
当我迭代列表时。谷歌搜索告诉我,这可能是因为我在迭代它时在另一个线程中更改该列表,为了使这个问题消失,我应该使用java.util.concurrent.CopyOnWriteArrayList
....
...除了我已经是了。
显然,我正在某个地方做一些非常愚蠢的事情。
有谁知道如何诱导CopyOnWriteArrayList
扔一个ConcurrentModificationException
?如果重要的话,我正在使用 Java 5。
Edit:由于我使用的变异器可能很重要,因此我通过两种方式修改此列表:
- 在前面添加元素。 (
list.add(0, newElement);
)
- 使用 subList 让较旧的项目从后面掉落。 (
list = list.subList(0, MAX_LIST_SIZE);
)
这些会引起危险信号吗?如果是这样,为什么?我的理解是,因为这些操作首先复制该内容,所以任何现有的迭代器都将指向未修改的原始版本,因此不会关心。我的知识有漏洞吗?
Edit 2:导致问题的确切代码仍然有点模糊,但我至少可以发布我看到的异常:
java.util.ConcurrentModificationException
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
at....
如果包含列表从其下方发生更改,则 CopyOnWriteArrayList.subLists 会抛出 ConcurrentModificationExceptions:
public class ListTest {
private static List<int[]> intList;
public static void main (String[] args) {
CopyOnWriteArrayList<Integer> cowal = new CopyOnWriteArrayList<Integer>();
cowal.add(1);
cowal.add(2);
cowal.add(3);
List<Integer> sub = cowal.subList(1, 2);
cowal.add(4);
sub.get(0); //throws ConcurrentModificationException
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)