【问题标题】:Is there a FIFO Queue which offers uniqueness based on some criteria是否有基于某些标准提供唯一性的 FIFO 队列
【发布时间】:2016-07-13 00:04:26
【问题描述】:

我正在使用 Java。我需要将数据发布到 FIFO 队列。该队列将由单独的线程处理。这样我就避免了阻塞主线程。 我关于发布数据的用例是:-

  • 每个数据对象都有一个唯一标识它的字段。所以有 50 多个这样的“键”。还有其他字段是对象的其余数据。
  • 如果出现新数据对象,则不应盲目地将其插入队列,而应替换旧数据对象。仅如果它们的数据基于字段比较等不同。否则它将被简单地丢弃。请记住,其中一个字段是关键。其余的是数据,可能会有很大差异。
  • 这些数据必须在 FIFO 基础上进行处理。因此我需要一种队列。
  • 不用说,它也应该是线程安全的。

有人知道满足这些标准的任何数据结构吗?谢谢。

【问题讨论】:

  • 如果更新应该替换现有条目,新条目是进入队列中旧条目的位置,还是旧条目从队列中删除,新条目添加到最后?
  • 还有,你期望什么样的并发性能?
  • 因为您的队列中最多有 50 个元素,您很可能会在一些同步块中使用简单的列表包装器。除非您需要极高的并发性。
  • 替换现有的更好。并发性.. 必须确保最新数据必须立即可供发布.. 具有财务影响。但我同意尺寸很小。

标签: java multithreading data-structures


【解决方案1】:

当我不得不在 C# 中做这样的事情时,我创建了一个包含字典和队列的自定义数据结构。 Dictionary 由项键索引,值包含与键关联的数据。队列只包含键。

要将项目插入队列,我执行了以下操作(伪代码)

lock the data structure
    if key exists in dictionary
        replace old item data in dictionary with new item data
    else
        add new item to the dictionary, indexed by key
        add new item key to the queue
release lock

要使项目出队:

lock
    remove first item key from queue
    lookup data for that key in dictionary
    remove item from dictionary
release lock
process the item

我们在多个线程中每秒执行数千次更新,并且没有遇到任何性能问题。锁只是没有保持很长时间。当然,您的里程可能会有所不同。

您可以通过添加主线程可以推送更新的无锁并发队列来避免主线程上的锁定。另一个线程可以为该队列提供服务并将项目添加到我上面描述的混合字典/队列结构中。

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 2012-04-30
    • 2022-06-29
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多