Re: finalize called on an object that's still in scope?
Paul Tomblin wrote:
In a previous article, Tom Hawtin <usenet@tackline.plus.com> said:
while(true)
{
try { Thread.sleep(5000); } catch (InterruptedException ie) {}}
lineup.hashCode(); // or System.identityHashCode(), or ...
}
Is this a hack, or is it normal that a local variable would be destructed
before it goes out of scope?
Destructed is a C++ term. It's probably a bad idea not to think of Java
finalising and destructing, because they are very different concepts. A
finaliser is not the opposite of a constructor.
The local variable is not finalised. The object that was once referred
to by the local variable is (or may be) finalised. Scope doesn't
actually have anything to do with it at all.
But the local variable is still in scope, so therefore is still referring
to it. I would not expect the object to be garbage
collected/finalized/destructed and if it is, then there is something
seriously wrong happening here.
The rules about finalization say nothing about variable scope. The
question is whether the object in question is "reachable":
"A reachable object is any object that can be accessed in any potential
continuing computation from any live thread. Optimizing transformations
of a program can be designed that reduce the number of objects that are
reachable to be less than those which would naively be considered
reachable. For example, a compiler or code generator may choose to set a
variable or parameter that will no longer be used to null to cause the
storage for such an object to be potentially reclaimable sooner."
[JLS, 12.6.1 Implementing Finalization,
<http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.6.1>]
This appears to me to be exactly the case in the original code. The
variable lineup will no longer be used, so the implementation has the
option of finalizing the object it referenced, assuming there are no
other references to it.
Patricia