【发布时间】:2013-12-03 20:27:22
【问题描述】:
我正在尝试维护一个键映射到它们各自的经过时间(长值)。 Guava 的 AtomicLongMap 非常适合这个问题,但有一个问题:我只想保持最大值(经过的时间),这样 Map 的大小就不会变得荒谬(有大量可能的键)。
因此,我想理想地驱逐条目以将地图保持在一定大小。将保留最大值。显然,我可以以阻塞方式(同步)执行此操作,但我正在寻找更少阻塞的东西,因为许多线程非常频繁地访问此映射。
我的一个想法是制作一个在达到某个阈值后运行的收割机,复制地图,修剪然后重置参考(可能是原子参考或标记为volatile)。当然,这有很多缺点,例如在复制地图时维护一个单独的线程并丢失数据,我确信还有其他各种可能出错的事情。
是否有我应该考虑的数据结构/库?
【问题讨论】:
-
为什么需要复制地图?为什么不直接删除旧条目?这听起来像你想实现一个移动窗口。也许带有二进制搜索的环形缓冲区会更简单。在当前线程中添加条目时,您可以使用环形缓冲区删除条目。
-
保留一个单独的排序数据结构,并根据需要使用它来删除条目。
-
@PeterLawrey 有一个原因,我现在忘记了为什么。我想我在这样做时担心地图会发生变化,但这没关系。
标签: java concurrency map guava