使用定时/瞬态条目映射 - 内存不是问题

时间:2010-12-28 17:28:44

标签: java map transient

我正在尝试创建一个地图,其中的条目超时并在一段时间后被删除。

基本上,<K, V> Map.put(K key, V value, long **time**) - 该条目将立即放入地图中,并在时间(ms)后过期。我不需要在将来的任何时候恢复删除的条目,但我想确保它不再在地图中。

例如:map.put("foo", "bar", 60l * 1000l)会让这个键值对在地图中生存一分钟(60长和1000长)。

尝试:使用ConcurentMap并通过以下方式实施Map.put(K key, V value, long **time**)
1.致电super.put(key, value)
2.创建一个休眠时间(ms)的线程 3.致电remove(key)删除条目。

问题:请评论/让我知道这在线程安全性,一致性或我尝试的任何缺陷方面是否是一个好主意。如果您认为有更好的方法可以实现这一目标,请提供任何建议。

编辑:感谢回复,内存不是这里的问题,我真的只关心条目的短寿命。谢谢。

3 个答案:

答案 0 :(得分:4)

时间是您正在解决的问题的重要组成部分吗?或者它是一个实现细节?如果您正在解决的问题是内存使用问题,那么我会想到另外两种可能性:

  • LRU地图。网上有很多这样的内容。
  • 由WeakReference或SoftReference对象支持的Map,允许GC收集这些项目。

修改

在这种情况下,有一些现有的实现可能会为您节省一些时间。例如:

答案 1 :(得分:1)

如果由于某些内存问题(地图是临时缓存)而这样做,您应该考虑使用软引用(documentation)。

答案 2 :(得分:1)

看看Guava - 这是Google的收藏库。特别是,您需要查看CacheBuilder及其计算映射。它的一个特点是“自上次访问或上次写入以来测量的条目的基于时间的到期”,听起来就像您正在寻找的那样。

(编辑谈论CacheBuilder;它是我发布的新内容,与问题更相关)