1

我正在编写一个有 2 个线程的程序。一个在迭代循环链表。列表总是有下一个元素,因为链表是循环的。修改列表的另一个线程。但我得到了并发修改异常。我能用它做什么?谢谢

4

3 回答 3

0

从以下 api 文档:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ConcurrentModificationException.html

当这种修改是不允许的时,检测到对象的并发修改的方法可能会抛出此异常。

例如,通常不允许一个线程在另一个线程对其进行迭代时修改 Collection。一般来说,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些迭代器实现(包括 JRE 提供的所有通用集合实现的那些)可能会选择抛出此异常。这样做的迭代器被称为快速失败迭代器,因为它们快速而干净地失败,而不是在未来不确定的时间冒着任意的、非确定性的行为的风险。

请注意,此异常并不总是表示对象已被不同的线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改了集合,则迭代器将抛出此异常。

于 2013-03-10T05:08:26.700 回答
0

在这种情况下不要使用迭代器,因为这就是异常的来源。

currentElement = currentElement.next()通过简单地设置或在您的(无限?)循环中调用它来推进当前元素。

如果列表不是线程安全的,那么在同时修改数据结构时可能会遇到麻烦。

于 2013-03-10T05:08:34.927 回答
0

假设您的实现是线程安全的(您使用的是哪个类?)迭代器本身并不是线程安全的。他们不对 List 持有锁,因此他们不能阻止其他线程修改它。

如果您的 CircularList 自身同步(不确定您使用的是什么,但线程安全列表很常见 - 否则迭代器基本上总是非线程安全的),您可以通过以下方式解决此问题:

synchronized(list) {
  Iterator i = list.iterator();
  doSomething(i);
}

另请参阅: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedList(java.util.List)

于 2013-03-10T06:18:10.270 回答