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