Java 匿名侦听器是否与弱引用不兼容?
我正在读一个刚刚被问到的问题: 我很困惑,直到有人回答如下: “此方法的问题是,您不能拥有仅在集合中引用的侦听器,因为它将随机消失(在下一次GC中)” 我的理解正确吗?使用弱引用(如存储在WeakHashMap中)与匿名侦听器不兼容 我通常会这样传递侦听器:Java 匿名侦听器是否与弱引用不兼容?,java,callback,garbage-collection,anonymous-methods,Java,Callback,Garbage Collection,Anonymous Methods,我正在读一个刚刚被问到的问题: 我很困惑,直到有人回答如下: “此方法的问题是,您不能拥有仅在集合中引用的侦听器,因为它将随机消失(在下一次GC中)” 我的理解正确吗?使用弱引用(如存储在WeakHashMap中)与匿名侦听器不兼容 我通常会这样传递侦听器: public static void main(String[] args) { final Observable obs = new SomeObservable(); obs.addObserver(new Observ
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跟踪侦听器(上面的默认Observable显然使用了一个旧的向量,但这只是一个示例,说明我通常如何创建一个匿名类来用作侦听器)
作为一个额外的问题:如果可观察的主体使用WeakHashMap,那么对匿名侦听器的引用何时有资格获得GC?主方法何时退出?obs.addObserver通话一结束
对于匿名类实例的引用在何处/如何/何时为GC保留/存储/可省略,我有点困惑
显然,如果我保留一个普通引用,它就不符合GC的条件,但是当它在WeakHashMap中时,侦听器什么时候才变得适合GC?如果一个对象只是WeakHashMap的一个键,那么它符合条件,并且可能在下一次GC中被清除
使用弱引用集合的整个想法是隐式删除不再被引用的侦听器。(这避免了内存泄漏的可能性)问题是监听器可以在“随机”时间点提前删除。是的,您是对的,一个维护弱引用监听器的可监听器类(如WeakHashMap)需要独立的持久性。可用于侦听器具有子级和父级的侦听器层次结构 对于非WeakReference用法,必须调用显式removeListener。除非侦听器对象的寿命与可侦听对象的寿命相同。在大多数用例中,这很好,匿名类也可以 对于匿名类实例,泄漏(GC预防)仅在访问类主体外部的最终对象时发生
注意:WeakHashMap i.a.对自己的Map.Entry子类使用弱引用。这有时可能令人难以置信。谢谢你的帮助,我理解。但我的问题确实与匿名侦听器有关:如果我在WeakHashMap中放置对匿名侦听器的引用,是否还有对该匿名侦听器的引用保存在其他地方?如果不是,GC在什么时候变得可省略?在哪个电话之后?