Java中有SoftHashMap吗?
我知道有一个WeakHashMap
in java.util
,但是由于它对WeakReference
所有东西都使用s,而这仅由this
Map
引用,因此被引用的对象将在下一个GC周期丢失。因此,如果您要缓存随机数据,这几乎是没有用的,那么很可能会再次请求而无需在其余时间进行硬链接。最好的解决方案是使用SoftReference
s代替的map,但是我在Java
RT Package中找不到。
回答:
编辑(2012年8月):
事实证明,目前最好的解决方案可能是Guava
13.0的Cache
类,在Guava的Wiki上进行了解释-
这就是我要使用的。它甚至支持构建一个SoftHashMap
(请参阅参考资料CacheBuilder.newBuilder().softKeys()
),但这可能不是您想要的,正如Java专家Jeremy
Manson解释的那样(在下面您将找到链接)。
我不知道(2008年11月),但是您可以SoftHashMap
在网上找到一些实现。
喜欢这个:SoftHashMap
或者这个。
编辑(2009年11月),
正如Matthias在评论中提到的那样,Google
Guava
确实使用了SoftReferences:
一个
ConcurrentMap
制造商,提供的这些特征的任意组合:
- 软键或弱键,
- 软值或弱值,
- 定时到期,以及
- 按需计算值。
如该线程中所述,另一个JSR166y候选人:
jsr166y.ConcurrentReferenceHashMap
它为Google实现提供了一个替代的并发参考映射(依赖于后台线程逐出条目)
编辑(2012年8月)
Google实现仅在请求条目的过期时间时才使用后台线程。特别是,它仅使用java.util.Timer
,而不像具有单独的后台线程那样具有侵入性。
杰里米·曼森(Jeremy
Manson)建议,对于任何缓存,都应使用此功能以避免SoftReference的危险:http : //jeremymanson.blogspot.de/2009/07/how-
hotspot-decides-to-clear_07.html
Apache
Commons提供了另一种实现,即org.apache.commons.collections.map.ReferenceMap
; 它不支持定时删除,但是它支持选择是按身份还是按相等来比较密钥。此外,此实现不是并发的-可以使其同步,但是在来自多个线程的访问下效果不佳。
以上是 Java中有SoftHashMap吗? 的全部内容, 来源链接: utcz.com/qa/401929.html