同步循环链表

时间:2013-03-10 05:04:06

标签: java synchronization linked-list

我正在编写一个包含2个线程的程序。一个迭代循环链表。列表始终是下一个元素,因为链表是循环的。修改列表的另一个线程。但是我得到了concurrentModificationException。 我该怎么办? 感谢

3 个答案:

答案 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);
}

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