【发布时间】:2014-08-23 20:48:55
【问题描述】:
为什么没有使用LinkedBlockingQueue的方式实现ABQ。我们可以使用 AtomicInteger 来保持 ABQ 中的 Track 计数,这与 LBQ 一样。我们也可以将两把锁用于 ABQ。 我偶然发现了关于 SO 的类似问题。 ArrayBlockingQueue uses a single lock for insertion and removal but LinkedBlockingQueue uses 2 separate locks
但我无法理解该问题的答案。我需要帮助来理解如果我们使用两个锁实现 ABQ 会出现的问题。 如果有人可以举例说明可能失败的竞争条件,那就太好了。 这个问题可以标记为重复,但我真的在寻找更具描述性的答案。这将是一个很大的帮助。
我在这里粘贴了一个代码 http://pastebin.com/ZD1uFy7S 。任何人都可以显示粘贴的代码中是否可能存在竞争条件。
【问题讨论】:
-
这个问题几乎可以肯定对于 StackOverflow 来说太宽泛了。您正在询问算法的设计。 StackOverflow 应该针对特定的编程问题:例如,“我尝试了这个......示例代码......当我期望它做 Y 时它做了 X。什么给出了?”
-
如果有两个锁,你可以有更好的吞吐量,就像在 LinkedBlockingQueue 的情况下一样。生产者不需要与消费者竞争
-
@user3580294,不正确! LinkedBlockingQueue 不使用两个锁,因为一个不足:一个锁可以提供足够的安全性,但两个可以(在那个算法中)提供相同级别的安全性,但具有更好的安全性性能水平。
-
在 Array 实现中,两个锁无法提供足够的安全性,因为队列的头尾之间的关系比链接队列中的耦合更紧密。
-
@jameslarge 实际上并没有要求整个算法,而只是它不使用与 LBQ 相同的策略的一个很好的理由
标签: java multithreading concurrency java.util.concurrent blockingqueue