【问题标题】:Alternative to using LinkedQueue?替代使用 LinkedQueue?
【发布时间】:2013-03-19 15:32:03
【问题描述】:

我想知道哪个是使用 EDU.oswego.cs.dl.util.concurrent.LinkedQueue 的最佳替代方案。

以下情况:

public class testQueue extends LinkedQueue implements TestInterface {

public void putTestObject (TestObject to) {
    put(to);
}

我应该使用LinkedBlockingQueue 还是LinkedTransferQueue

我只使用put()take()isEmpty() 方法

【问题讨论】:

  • 我不知道 Java 7 LinkedTransferQueue 会给你带来什么。 LinkedBlockingQueue 应该足够了,除非这是一些支持高性能的集合。
  • 为什么您要寻找替代方案?你似乎有一个可行的解决方案。那有什么问题?为什么要更换它呢?

标签: java concurrency queue


【解决方案1】:

TransferQueue(扩展BlockingQueue)提供了额外的操作transfer。如果您只使用puttakeisEmpty,那么使用BlockingQueue 就足够了。

【讨论】:

  • 顺便说一句,isEmpty 可能会返回 false 并且随后的 take 可能会阻塞。如果这是一个问题,请考虑使用peek(它返回但不删除头元素,如果队列为空,则返回null)。
【解决方案2】:

LinkedBlockingQueue 会好的。由于您没有使用任何传输机制,LinkedQueue 与 LinkedBlockingQueue 非常相似。唯一明显的区别是 LinkedQueue 使用 1 个锁,而 LBQ 使用 2 个。

【讨论】:

  • 小心。您听起来好像 LBQ 使用两个锁是一件坏事(无论这是否是您的意图)。 LBQ 使用了两个锁,但它们是相互独立的,即有一个用于“puts”的锁和一个用于“takes”的锁。有关此“两个锁队列”的更多详细信息,请参见此处:cs.rochester.edu/u/scott/papers/1996_PODC_queues.pdf
  • @TonyRedwood 我的意图不是暗示好坏,只是说明差异。如果有任何两个锁具有更好的性能,那么无论如何都要一个。
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2020-01-28
  • 2023-04-10
相关资源
最近更新 更多