带有弱键和身份哈希的ConcurrentHashMap?

时间:2013-03-17 01:45:47

标签: java concurrency weak-references concurrenthashmap

如何在Java中获得具有弱键和标识哈希的ConcurrentHashMap?我认为Google Guava Collections可以提供这样的东西,但我可以从标准库中获取它吗?我还有其他选择吗?

4 个答案:

答案 0 :(得分:10)

  

我认为Google Guava Collections可以提供这样的功能,但是我可以从标准库中获取它吗?

简短的回答是,否则Java SE没有实现这种特殊的组合。

  • 您可以使用java.util.concurrent.ConcurrentHashMap密钥实例化WeakReference,并执行一些额外的工作来实现删除已损坏引用的映射条目,但这不会为您提供标识哈希语义。 / p>

  • 您可以使用java.util.IdentityHashMap密钥实例化WeakReference,并执行一些额外的工作来实现删除已损坏引用的映射条目,但这不会为您提供并发行为。

  • 使用java.util.WeakHashMap不会为您提供并发或身份哈希。

  • 您可以(理论上)将密钥类包装为覆盖自然equalshashcode方法的内容。但这很可能无法使用。

  • 我认为不可能通过覆盖ConcurrentHashMapIdentityHashMap中的方法来实现这一目标。


也许唯一可行的选择是更改基于身份的密钥类equalshashcode方法。但这不适用于“内置”键类型(尤其是final键)或者在应用程序的其他部分需要基于值的equals / hashcode的情况。

答案 1 :(得分:2)

Google Guava实施似乎是最简单的方法。可以使用new MapMaker().weakKeys().makeMap()初始化所需的地图,并使用java.util.concurrent.ConcurrentHashMap。有关详细信息,请参阅apidoc

答案 2 :(得分:1)

如果您的应用程序在spring框架(版本为gt 3.2)下,则可以考虑使用org.springframework.util.ConcurrentReferenceHashMap。下面是它的描述:

  

一个ConcurrentHashMap,它对键和值使用软引用或弱引用。   此类可以用作Collections.synchronizedMap(new WeakHashMap>())的替代方法,以便在并发访问时支持更好的性能。此实现遵循与ConcurrentHashMap相同的设计约束,除了支持空值和空键。

     

注意:使用引用意味着不能保证放置在地图中的项目随后将可用。垃圾收集器可能会随时丢弃引用,因此似乎有一个未知线程正在静默删除条目。

     

如果未明确指定,则此实现将使用软条目引用。

答案 3 :(得分:0)

搜索ConcurrentWeakIdentityHashMap,你会得到很多例子。我自己写了一个工具,因为我认为org / ehcache / core / internal / util / ConcurrentWeakIdentityHashMap $ WeakReference的hashCode非常糟糕。

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode