我有这样的事情:

 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吗?)

我不知道如何将其放入代码中。

最佳答案

参考队列

一旦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);

09-13 08:10