如何知道与WeakHashMap中已删除条目关联的值

时间:2010-06-29 16:08:46

标签: java weak-references weakhashmap

我有这样的事情:

 private Map<MyObj1, MyObj2> map = new WeakHashMap<MyObj1, MyObj2>();

 ... somewhere in the code ...
 MyObj1 myObj1 = new MyObj1();
 map.put(myObj1, new MyObj2();
 ...
 myObj1 = null;

... somewhere else in a thread ... (I would like to pass to a checkThis(MyObj2) method the Value associated with the entry that was removed from the Map)
/* something like this maybe */
while (true) {
    MyObj2 myObj2 = referenceQueue.remove().get();
    checkThis(myObj2);
}
GC进场时可能会删除

MyObj1键,并且没有强烈的引用。

我想传递给checkThis(MyObj2)与已删除的密钥相关联的特定地图值对象(可能会检查ReferenceQueue?)

我无法弄清楚如何将其放入代码中。

4 个答案:

答案 0 :(得分:1)

来自对另一个答案的评论:

  

会话到期后我想要那个   (并没有强烈的参考   那个会话在我的App环境中)   列表是迭代的,取消是   呼吁所有剩余的期货   那些等待被执行的人。这个   避免安排那些工作   即使用户会话即将运行   过期。

这听起来像是HttpSessionBindingListener

的工作

答案 1 :(得分:0)

关于你想要做什么的真正问题是WeakHashMap依赖于垃圾收集器来释放不可用的项目。

由于GC会随时随地完成工作,而不会对您正在做的事情有任何尊重,因此很难跟踪hashmap上的更改。实际上你说的是什么

  

“当没有强引用时,MyObj1键被删除”

不准确。 MyObj1可以自由发布,如果它没有强大的参考,但如果没有必要发布它,它就不会被释放。

答案 2 :(得分:0)

来自WeakHashMap序言(斜体添加):

  
    

具有弱键的基于哈希表的Map实现。当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除。更确切地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收。当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现的行为略有不同。

  

然而,当WeakHashMap“失去”一个条目时,你永远不会告诉你:-)如果你只关心特定实例的密钥,那么你可以使用地图扫描(也只适用于某些n)。否则,请继续关注ReferenceQueue。

此链接可能有用:Java Reference Objects

答案 3 :(得分:0)

参考队列

一旦WeakReference开始返回null,它指向的对象就变成了垃圾,WeakReference对象几乎没用。这通常意味着需要进行某种清理;例如,WeakHashMap必须删除这些已经失效的条目,以避免持有越来越多的死WeakReferences。

ReferenceQueue类可以轻松跟踪死引用。如果将ReferenceQueue传递给弱引用的构造函数,则当它引用的对象变为垃圾时,引用对象将自动插入引用队列。然后,您可以定期处理ReferenceQueue并执行死引用所需的任何清理。

See this page有关如何使用的教程。

你能否说明你使用它的原因?有效用途很少 即缓存不是有效用途(或至少不是一个好用途)

编辑:

此代码相当于使用weakHashMap,但您需要显式执行此操作以将队列与地图关联。

HashMap aHashMap = new HashMap();
ReferenceQueue Queue = new ReferenceQueue();
MyWeakReference RefKey = new MyWeakReference(key, Queue);
aHashMap.put(RefKey, value);