If I have
public class Foo {
private boolean finalized = false;
public void foo() {
if (finalized)
throw new IllegalStateException("finalize() has been called.");
}
@Override public void finalize() {
super.finalize();
finalized = true;
}
}
Is it guaranteed, even in the face of multiple threads, assuming only the GC will call finalize()
, that the IllegalStateException
will never be thrown?
I know that in the face of a finalize()
method that causes the object to be not garbage-collectable, the object won't be garbage collected and other methods might be called. But this finalize()
doesn't do that. Is there still a possibility of foo()
being called after finalize()
?
It's entirely possible that a different object which had a reference to the instance of Foo
is being finalized at the same time - and may resurrect the Foo
object, allowing it to be used after finalization. This is kinda rude, but can certainly happen.
Even without resurrection, another finalizer could call Foo.foo()
from its finalizer:
public class Bar {
private final Foo foo;
@Override protected void finalize() {
// The finalizer in foo may already have executed...
foo.foo();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With