Java 受大小或自动逐出限制的最大值的并发映射(AtomicLongMap)

Java 受大小或自动逐出限制的最大值的并发映射(AtomicLongMap),java,concurrency,map,guava,Java,Concurrency,Map,Guava,我试图维护一个键到它们各自经过的时间(长值)的映射。Guava很好地解决了一个问题:我只想保持最大值(经过的时间),这样地图的大小就不会变得可笑(可能有大量的键) 因此,理想情况下,我希望逐出条目,以将地图保持在一定的大小。将保留最大值。显然,我可以用阻塞方式(同步)来实现这一点,但我正在寻找一些更少阻塞的东西,因为许多线程非常频繁地访问这个映射 我的一个想法是制作一个收割器,在达到某个阈值后运行,复制地图,修剪然后重置参考(可能是原子参考或标记为volatile)。当然,这有很多缺点,比如在复

我试图维护一个键到它们各自经过的时间(长值)的映射。Guava很好地解决了一个问题:我只想保持最大值(经过的时间),这样地图的大小就不会变得可笑(可能有大量的键)

因此,理想情况下,我希望逐出条目,以将地图保持在一定的大小。将保留最大值。显然,我可以用阻塞方式(同步)来实现这一点,但我正在寻找一些更少阻塞的东西,因为许多线程非常频繁地访问这个映射

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


有一个数据结构/库我应该考虑吗?

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

为什么需要复制映射?为什么不直接删除旧条目呢?这听起来像是要实现一个移动窗口。也许使用二进制搜索的环形缓冲区会更简单。当在当前线程中添加一个条目时,您可以使用环形缓冲区来删除条目。保留一个单独的排序数据结构,并根据需要使用它来删除条目。@PeterLawrey这是有原因的,我现在忘记了原因。我想我关心的是地图的变化,但这并不重要。除了环形缓冲区必须按照地图条目值保持排序顺序,这样它就会成为一个循环优先级队列,不是吗?@JimGarrison我假设添加的顺序是按时间顺序的,所以不需要排序。