Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名侦听器是否与弱引用不兼容?_Java_Callback_Garbage Collection_Anonymous Methods - Fatal编程技术网

Java 匿名侦听器是否与弱引用不兼容?

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

我正在读一个刚刚被问到的问题:

我很困惑,直到有人回答如下:

“此方法的问题是,您不能拥有仅在集合中引用的侦听器,因为它将随机消失(在下一次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跟踪侦听器(上面的默认Observable显然使用了一个旧的向量,但这只是一个示例,说明我通常如何创建一个匿名类来用作侦听器)

作为一个额外的问题:如果可观察的主体使用WeakHashMap,那么对匿名侦听器的引用何时有资格获得GC?主方法何时退出?obs.addObserver通话一结束

对于匿名类实例的引用在何处/如何/何时为GC保留/存储/可省略,我有点困惑


显然,如果我保留一个普通引用,它就不符合GC的条件,但是当它在WeakHashMap中时,侦听器什么时候才变得适合GC?

如果一个对象只是WeakHashMap的一个键,那么它符合条件,并且可能在下一次GC中被清除


使用弱引用集合的整个想法是隐式删除不再被引用的侦听器。(这避免了内存泄漏的可能性)问题是监听器可以在“随机”时间点提前删除。

是的,您是对的,一个维护弱引用监听器的可监听器类(如WeakHashMap)需要独立的持久性。可用于侦听器具有子级和父级的侦听器层次结构

对于非WeakReference用法,必须调用显式removeListener。除非侦听器对象的寿命与可侦听对象的寿命相同。在大多数用例中,这很好,匿名类也可以

对于匿名类实例,泄漏(GC预防)仅在访问类主体外部的最终对象时发生


注意:WeakHashMap i.a.对自己的Map.Entry子类使用弱引用。这有时可能令人难以置信。

谢谢你的帮助,我理解。但我的问题确实与匿名侦听器有关:如果我在WeakHashMap中放置对匿名侦听器的引用,是否还有对该匿名侦听器的引用保存在其他地方?如果不是,GC在什么时候变得可省略?在哪个电话之后?