我正在编写一个有 2 个线程的程序。一个在迭代循环链表。列表总是有下一个元素,因为链表是循环的。修改列表的另一个线程。但我得到了并发修改异常。我能用它做什么?谢谢
3 回答
从以下 api 文档:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ConcurrentModificationException.html
当这种修改是不允许的时,检测到对象的并发修改的方法可能会抛出此异常。
例如,通常不允许一个线程在另一个线程对其进行迭代时修改 Collection。一般来说,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些迭代器实现(包括 JRE 提供的所有通用集合实现的那些)可能会选择抛出此异常。这样做的迭代器被称为快速失败迭代器,因为它们快速而干净地失败,而不是在未来不确定的时间冒着任意的、非确定性的行为的风险。
请注意,此异常并不总是表示对象已被不同的线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改了集合,则迭代器将抛出此异常。
在这种情况下不要使用迭代器,因为这就是异常的来源。
currentElement = currentElement.next()
通过简单地设置或在您的(无限?)循环中调用它来推进当前元素。
如果列表不是线程安全的,那么在同时修改数据结构时可能会遇到麻烦。
假设您的实现是线程安全的(您使用的是哪个类?)迭代器本身并不是线程安全的。他们不对 List 持有锁,因此他们不能阻止其他线程修改它。
如果您的 CircularList 自身同步(不确定您使用的是什么,但线程安全列表很常见 - 否则迭代器基本上总是非线程安全的),您可以通过以下方式解决此问题:
synchronized(list) {
Iterator i = list.iterator();
doSomething(i);
}