michael nesterenko michael nesterenko - 1 year ago 62
Java Question

ThreadLocal garbage collection

From javadoc

Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).

from that it seems that objects referenced by a ThreadLocal variable are garbage collected only when thread dies. But what if ThreadLocal variable
is no more referenced and is subject for garbage collection? Will object references only by variable
be subject to garbage collection if thread that holds
is still alive?

for example there is following class with ThreadLocal variable:

public class Test {
private static final ThreadLocal a = ...; // references object b

This class references some object and this object has no other references to it. Then during context undeploy application classloader becomes a subject for garbage collection, but thread is from a thread pool so it does not die. Will object
be subject for garbage collection?

Answer Source

ThreadLocal variables are hold in Thread

ThreadLocal.ThreadLocalMap threadLocals;

which is initialized lazily on first ThreadLocal.set/get invocation in the current thread and holds reference to the map until Thread is alive. However ThreadLocalMap uses WeakReferences for keys so its entries may be removed when ThreadLocal is referenced from nowhere else. See ThreadLocal.ThreadLocalMap javadoc for details