Bla*_*ppo 15 java collections multithreading exception
ConcurrentModificationException当我迭代一个列表时,我偶尔会得到一个.谷歌搜索告诉我,这可能是因为我在迭代它时在另一个线程中改变该列表并且为了使这个问题消失我应该使用java.util.concurrent.CopyOnWriteArrayList....
......除了我已经是.
显然,我在某个地方做了一些非常愚蠢的事情.
有没有人能够了解一个人如何诱导CopyOnWriteArrayList抛出一个ConcurrentModificationException?如果重要,我正在使用Java 5.
编辑: 由于我正在使用的mutators可能很重要,我正在以两种方式修改此列表:
list.add(0, newElement);)list = list.subList(0, MAX_LIST_SIZE);)那些举起红旗吗?如果是这样,为什么?我的理解是,因为这些操作首先复制了这个东西,所以任何现有的迭代器都会指向未经修改的原始文件,因此不关心.我的知识有洞吗?
编辑2: 导致问题的确切代码仍然有点模糊,但我至少可以发布我看到的异常:
java.util.ConcurrentModificationException
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
at....
...它指向我的代码中的for-each循环实例化.
这COWSubList似乎意味着我的呼唤subList是我问题的根源; 我还是想明白为什么.
编辑3: *facepalm*
CopyOnWriteArrayList.subList()返回a List,而不是 a CopyOnWriteArrayList.它返回的清单没有提供任何COWAL保护的隐含义务.这使得subList()像这样使用删除元素非常糟糕的想法.
不确定这是否是我的罪魁祸首,但它是可疑的,无论如何都需要纠正.
Sbo*_*odd 18
如果包含列表从其下面更改,则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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9266 次 |
| 最近记录: |