Я искал ошибку в моем коде, которая, кажется, вызвана некоторым "уродливым" кодом финализатора. Код выглядит примерно так:
public class A {
public B b = new B();
@Override public void finalize() {
b.close();
}
}
public class B {
public void close() { /* do clean up our resources. */ }
public void doSomething() { /* do something that requires us not to be closed */ }
}
void main() {
A a = new A();
B b = a.b;
for(/*lots of time*/) {
b.doSomething();
}
}
Я думаю, что происходит, что a
обнаруживается как не имеющий ссылок после
вторая строка main()
и получение GC'd и финализация потока финализатора - пока цикл for
все еще происходит, используя b
, а a
по-прежнему "в области видимости".
Является ли это правдоподобным? Является ли java доступным для GC объекта перед тем, как он выходит из области видимости?
Примечание. Я знаю, что делать что-либо внутри финализаторов плохо. Это код, который я унаследовал и намерен исправить, - вопрос в том, правильно ли я понимаю проблему с корнем. Если это невозможно, то что-то более тонкое должно быть корнем моей ошибки.