Анонимные слушатели несовместимы со слабыми ссылками?

Я читал этот вопрос, который только что задали: Избегать утечек памяти в обратных вызовах?

И я был весьма сбит с толку, пока кто-то не ответил следующее:

«Проблема с этим подходом заключается в том, что у вас не может быть слушателя, на который есть только ссылка в коллекции, поскольку он исчезнет случайным образом (на следующем 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? Когда завершается работа основного метода ? Как только вызов obs.addObserver завершится?

Я немного запутался в том, где / как / когда ссылки на экземпляры анонимных классов хранятся / хранятся / становятся понятными для GC.

Очевидно, что если я сохраняю обычную ссылку, она не подходит для GC, но что, когда она находится в WeakHashMap, когда именно слушатель становится понятным для GC?

17
задан Community 23 May 2017 в 12:16
поделиться