【问题标题】:Java: is there another kind of linked list somewhere?Java:在某处有另一种链表吗?
【发布时间】:2011-04-04 07:35:45
【问题描述】:

是否有一个预先实现的链表可以使用 id 而不是数组索引来实现?

动机:我想在这里完成的是一个来自女巫单元的链表可以被并行的多个线程删除。 java 的 LinkedList 的问题在于引用是索引 ref。

澄清一下:假设我有三个线程和一个包含三个单元格的 LinkedList。 1号线程产生到1号单元格(或0,但无论如何......),......并且线程3号产生到3号单元格。所以基本上线程会产生作为缓冲区工作的单元格的东西。现在,如果线程 2 删除了单元 2(出于业务逻辑原因),线程 #3 的引用更改为 #2。当然,如果线程#3 仍在单元格#3 上工作,则无法做到这一点,因此需要同步,即使线程#3 当前没有使用它的单元格,仍然需要告知线程它将使用单元格#2 从现在开始。

解决方案:如果使用 id 而不是数组索引引用来实现链表,则其他线程将永远不会看到更改,即可以安全地删除第二个单元格,因为线程 #3 将使用它的单元格类似这样linkedlist.add(id 3, C cell) 而不是像这样的 add(int index, C cell)。

我想这样的东西已经在某个地方实现了,但是经过一段时间的谷歌搜索,我找不到它。感谢所有帮助!

【问题讨论】:

  • 似乎您超出了此处为链接列表设计的范围..
  • LinkedList 的实现从不使用数组索引。为什么要使用索引而不是迭代器?

标签: java data-structures collections linked-list


【解决方案1】:

LinkedHashMap 似乎相关,但我不确定它是否完全适合您的场景。试试看。这是HashMap,因此您正在使用它们的密钥访问项目。

【讨论】:

    【解决方案2】:

    链接列表指的是“下一个”,当“N”很大时,在尝试访问索引“N”处的项目时,使用链接列表中的索引可能会导致性能下降。

    为什么需要列表?订单有那么大的问题吗?为什么不能使用地图?

    【讨论】:

    • 我对没有我想要的数据结构感到非常恼火,以至于我没有想得更大。我需要一张地图。谢谢!
    【解决方案3】:

    只有两种方法可以按位置来讨论传统的 List 元素。

    • 您可以通过索引来引用列表元素;即通过从第一个元素开始到达元素所需的步骤数。 (这就是List.get(int) 的意思。)问题是元素的索引可能会由于列表上的其他操作而改变。

    • 您可以使用Iterator 作为光标来引用列表元素。其他一些操作可以删除您正在查看的元素之前或之后的元素,但这不应该影响当前的元素,前提是您使用适当的List 实现。 (如果使用非并发列表,很可能会得到ConcurrentModification 异常。)

    底线是,如果您担心其他线程的更新会导致索引发生变化,请不要使用索引。使用Iterator,以及支持并发修改的集合实现;例如CopyOnWriteArrayListConcurrentLinkedQueue 或其他其中之一……具体取决于您要做什么以及需要什么保证。


    我不知道任何允许您锁定会更改元素位置的更新的 List 实现。列表 API 不支持这种事情。

    另外:

    • 锁定这样的列表可能是主要的并发瓶颈,并且
    • LinkedList 上使用 get(int)set(int, Object) 无法扩展。

    【讨论】:

    • 感谢您的意见!基本思想是不锁定任何东西,即使移除元素也是如此。
    猜你喜欢
    • 2017-04-27
    • 2013-03-05
    • 1970-01-01
    • 2022-08-21
    • 2018-04-14
    • 2020-12-18
    • 2012-05-10
    • 2011-03-15
    • 2017-01-25
    相关资源
    最近更新 更多