是否有预先实现的链表可以用id而不是数组索引实现?
动机:我想在这里完成的是一个来自女巫细胞的链表可以通过parellel中的多个线程删除。 java的LinkedList的问题是引用是索引引用。
澄清一下:假设我有三个线程和三个单元格的LinkedList。第一个线程产生第一个单元格(或0但是无论如何......),......第三个线程产生第三个单元格。所以基本上线程产生的东西到它们作为缓冲区的单元格。现在,如果线程号2删除了第二个单元格(出于业务逻辑原因),则线程#3的引用变为#2。当然,如果线程#3仍在单元格#3上工作,则无法完成,因此需要同步,即使线程#3当前没有使用它的单元格,仍然需要告知线程它将使用单元格从现在开始#2。
解决方案:如果链接列表是使用id而不是数组索引引用实现的,则其他线程永远不会看到更改,即可以安全地删除单元格二,因为线程#3将使用它的单元格这样的东西linkedlist.add(id 3,C cell)而不是像这样添加(int index,C cell)。
我想这样的事情已经在某处实现了,但经过一段时间的谷歌搜索,我找不到它。所有帮助都得到了赞赏!
答案 0 :(得分:3)
LinkedHashMap
似乎相关,但我不确定它是否完全适合您的情况。试试吧。它是HashMap
,因此您可以使用密钥访问项目。
答案 1 :(得分:2)
链接列表引用“下一步”,当“N”为大数时,使用链接列表中的索引可能会导致在索引“N”处访问项目时性能不佳。
为什么需要清单?是一个很大的问题的顺序?为什么你不能使用地图?
答案 2 :(得分:1)
只有两种方式可以按位置讨论传统的List元素。
您可以通过索引引用列表元素;即,从第一个元素开始到达元素所需的步骤数。 (这就是List.get(int)
的意思。)问题是元素的索引可能会因列表中的其他操作而发生变化。
您可以使用Iterator
作为游标来引用列表元素。某些其他操作可能会删除您正在查看的元素之前或之后的元素,但如果您使用适当的List
实现,则不会影响当前元素。 (如果您使用非并发列表,则可能会获得ConcurrentModification
个例外。)
最重要的是,如果您担心某些其他线程的更新导致索引更改,请不要使用索引。使用Iterator
和支持并发修改的集合实现;例如CopyOnWriteArrayList
,ConcurrentLinkedQueue
或其中一个......具体取决于您要做的事情以及您需要的保证。
我不知道任何List实现允许您锁定更改元素位置的更新。 List API不支持这种事情。
此外:
get(int)
上使用set(int, Object)
或LinkedList
无法扩展。