【问题标题】:Lock-Free Concurrent Linked List in JavaJava中的无锁并发链表
【发布时间】:2011-06-11 03:11:22
【问题描述】:

我想使用类似this 论文中描述的链接列表。 但是,我在网上没有找到任何 Java 实现。

如果不存在上述链接列表的java实现,我想,我会使用java.util.concurrent.ConcurrentLinkedQueue<E>。这是一个不错的选择吗(它不是真正的链表)?

如果这不是一个好的选择,有没有人知道 Java 中可靠的并发(线程安全)无等待(无锁)链表实现?

【问题讨论】:

  • 它不是任何形式的无锁(它确实使用锁来添加/删除)-doh 目标评论消失了......(它是关于 LinkedBlockingDeque)
  • 嗯,最大的问题是,你为什么认为你想要一个任何形状或形式的并发列表?大多数 List 方法在共享并发结构上没有意义。为什么你会得到第 n 个元素?无论如何,获得第 n 个元素是什么意思?像大小这样的东西是短暂的,除了监控之外没有任何价值。你能解释一下你想如何使用它吗? permalink.gmane.org/gmane.comp.java.jsr.166-concurrency/6321
  • 我想实现一个单例“物理”缓冲区,由 n 个“逻辑”缓冲区使用,其中每个逻辑缓冲区仅由其开始和结束元素定义,s.t.我的数据在内存中没有冗余表示。
  • 好吧,我还是不明白你要解决什么问题,你只是概述了一个解决方案。通常在并发算法中,您确实需要用内存换取隔离,但协调访问和修改同一内存的成本可能会令人望而却步。参见 Guy Steele,例如 infoq.com/presentations/Thinking-Parallel-Programming

标签: java concurrency linked-list


【解决方案1】:

ConcurrentLinkedQueue 是一个极好的无锁队列,可以做并发单链表可以做的事情。 一个小警告:如果你不使用 poll 或 peek 而只使用 iterator() (+.remove()) 它会泄漏内存。

这是一个出色的Queue

【讨论】:

  • JDK 7 有一个 ConcurrentLinkedDeque
  • 假设我想要 ConcurrentLinkedDeque,安装当前 jdk7 预览版的安全性如何?
  • 实际上用Java实现它相当简单(队列,双端队列)。感谢 GC,没有 ABA。如果您有 GC,总体并发/无锁算法会更容易...将代码放在引导路径中。为了确保我不会出错,我将检查最新的 JDK7 源代码并判断代码是否可以安全地反向移植(复制)到 jdk6
  • @betsss 我觉得这太过分了。 OP 可以去g.oswego.edu/dl/concurrency-interest 下载jar。考虑到它将与 Java 7 一起引入(应该很快就会上线),它应该非常稳定。
  • 是的,它看起来可以安全地复制到并使用 jdk6 运行
猜你喜欢
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2020-07-08
相关资源
最近更新 更多