4

我有这样的事情:

 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);
}

MyObj1当 GC 发挥作用并且没有强引用它时,key 可能会被删除。

我想传递给与checkThis(MyObj2)被删除的键关联的特定映射值对象(也许检查一个ReferenceQueue?)

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

4

4 回答 4

1

从对另一个答案的评论:

我希望一旦会话到期(并且在我的应用程序上下文中没有对该会话的强引用),将迭代 List 并在所有等待执行的剩余 Futures 上调用取消。这是为了避免即使用户会话过期也会运行计划的作业。

这听起来像是一份工作HttpSessionBindingListener

于 2010-07-06T18:44:21.680 回答
1

参考队列

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

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

有关如何使用的教程, 请参阅此页面。

你能说明你为什么使用这个吗?很少有有效的用途。
即缓存不是一个有效的用途(或至少不是一个好的用途)

编辑:

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

HashMap aHashMap = new HashMap();
ReferenceQueue Queue = new ReferenceQueue();
MyWeakReference RefKey = new MyWeakReference(key, Queue);
aHashMap.put(RefKey, value);
于 2010-06-29T18:54:50.583 回答
0

您想要做的真正问题是WeakHashMap依赖垃圾收集器来释放未使用的项目。

由于 GC 会在需要时执行其工作,而不会尊重您所做的事情,因此很难跟踪 hashmap 上的更改。其实你说的

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

不准确。MyObj1如果它周围没有强大的 refs,它可以由 GC 自由释放,但如果不需要释放它,它就不会被释放。

于 2010-06-29T16:14:22.000 回答
0

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

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

但是,当 WeakHashMap “丢失”一个条目时,您永远不会被告知 :-) 如果您只关心特定时间的键,那么您可以使用地图扫描(也仅实用对于一些 n)。否则,请按照您对 ReferenceQueue 的预感进行。

这个链接可能有用:Java Reference Objects

于 2010-06-29T16:16:44.697 回答