匿名侦听器是否与弱引用不兼容?
我正在阅读这个问题,刚刚被问到:避免回调中的内存泄漏?
我很困惑,直到有人回答以下问题:
“这种方法的问题在于,你不能有一个只在集合中引用的侦听器,因为它会随机消失(在下一个GC上)”
我的理解是否正确,即使用弱引用(例如存储在 WeakHashMap 中时)与匿名侦听器不兼容?
我通常像这样传递侦听器:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
我使用CopyOnWriteArrayList跟踪侦听器(上面的默认可观察显然使用旧的Vector,但它只是一个例子,以展示我通常如何创建一个匿名类作为侦听器)。
作为一个额外的问题:如果可观察的主题使用WeakHashMap,那么对匿名听众的引用何时有资格获得GC?当 main 方法退出时?一旦obs.addObserver调用结束?
我对GC保存/存储/可识别对匿名类实例的引用的位置/方式/时间有点困惑。
显然,如果我保留一个正常的引用,它就不符合GC的条件,但是当它在WeakHashMap中时,听者什么时候才能获得GC?