【问题标题】:A concurrent Map (AtomicLongMap) of the greatest values constrained by size or automatic eviction受大小或自动驱逐限制的最大值的并发 Map (AtomicLongMap)
【发布时间】:2013-12-03 20:27:22
【问题描述】:

我正在尝试维护一个键映射到它们各自的经过时间(长值)。 Guava 的 AtomicLongMap 非常适合这个问题,但有一个问题:我只想保持最大值(经过的时间),这样 Map 的大小就不会变得荒谬(有大量可能的键)。

因此,我想理想地驱逐条目以将地图保持在一定大小。将保留最大值。显然,我可以以阻塞方式(同步)执行此操作,但我正在寻找更少阻塞的东西,因为许多线程非常频繁地访问此映射。

我的一个想法是制作一个在达到某个阈值后运行的收割机,复制地图,修剪然后重置参考(可能是原子参考或标记为volatile)。当然,这有很多缺点,例如在复制地图时维护一个单独的线程并丢失数据,我确信还有其他各种可能出错的事情。

是否有我应该考虑的数据结构/库?

【问题讨论】:

  • 为什么需要复制地图?为什么不直接删除旧条目?这听起来像你想实现一个移动窗口。也许带有二进制搜索的环形缓冲区会更简单。在当前线程中添加条目时,您可以使用环形缓冲区删除条目。
  • 保留一个单独的排序数据结构,并根据需要使用它来删除条目。
  • @PeterLawrey 有一个原因,我现在忘记了为什么。我想我在这样做时担心地图会发生变化,但这没关系。

标签: java concurrency map guava


【解决方案1】:

最简单的选项可能是添加一个并发环形缓冲区。当你添加一个条目时,你会得到一个要从环形缓冲区中删除的条目。这样你就被限制在环形缓冲区的大小上,你不需要额外的线程。

【讨论】:

  • 除了环形缓冲区必须按 Map 条目值维护排序顺序,这样会使其成为循环优先级队列,不是吗?
  • @JimGarrison 我假设添加的顺序是按时间顺序排列的,所以不需要排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
相关资源
最近更新 更多