我有这样的事情:
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);