我正在使用 Java 中的 LinkedList
工作,我使用一个线程在列表中添加和删除项目。我只在头部添加元素,因为我将列表用作队列。我可能会添加一个元素,使用节点删除它,然后添加另一个元素等。因为它是双链接的,所以显然是有可能的。
我应该能够保留对节点的引用,这是通过 Java 中的迭代器完成的,但是当我创建一个迭代器然后向链表添加一些内容,然后通过我之前创建的迭代器删除元素时,它抛出一个 ConcurrentModificationException
。
我一直在搜索 docs却找不到任何东西。
我明白为什么我会得到异常(它在文档中说明...),但是我如何使用 LinkedList
实现这一点?这显然是可能的。
编辑: 发表评论的人可能不了解双链表的工作原理,所以让我简要介绍一下。
双链表有对其上一个和下一个元素的引用,因此您可以删除它仅引用 O(1) 中的节点。
下一步,我要澄清我想要的行为:
- 向列表中添加一个元素。
- 保存对该节点的引用
r
。 - 添加另一个元素。
- 删除旧引用
r
。
编辑#2: 我可以补充一点,C++ 可以毫无问题地做到这一点 (http://www.cplusplus.com/reference/list/list/)。
谢谢,
约翰
最佳答案
我认为这是不可能的,您应该使用 ConcurrentLinkedDeque。
JVM 已经过充分优化,不会对性能造成太大影响,它宣传的就是:
迭代器是弱一致性的,返回的元素反射(reflect)了双端队列在迭代器创建时或创建后的某个时刻的状态。它们不会抛出 ConcurrentModificationException,并且可能会与其他操作并发进行。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html
关于Java LinkedList 保留对节点的引用并添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33767805/