Class Overview
Java's builtin ThreadLocal has a serious flaw:
it can take an arbitrarily long amount of time to
dereference the things you had stored in it, even once the
ThreadLocal instance itself is no longer referenced.
This is because there is single, master map stored for
each thread, which all ThreadLocals share, and that
master map only periodically purges "stale" entries.
While not technically a memory leak, because eventually
the memory will be reclaimed, it can take a long time
and you can easily hit OutOfMemoryError because from the
GC's standpoint the stale entries are not reclaimable.
This class works around that, by only enrolling
WeakReference values into the ThreadLocal, and
separately holding a hard reference to each stored
value. When you call close()
, these hard
references are cleared and then GC is freely able to
reclaim space by objects stored in it.
We can not rely on remove()
as it
only removes the value for the caller thread, whereas
close()
takes care of all
threads. You should not call close()
until all
threads are done using the instance.
Summary
[Expand]
Inherited Methods |
From class
java.lang.Object
Object
|
clone()
|
boolean
|
equals(Object arg0)
|
void
|
finalize()
|
final
Class<?>
|
getClass()
|
int
|
hashCode()
|
final
void
|
notify()
|
final
void
|
notifyAll()
|
String
|
toString()
|
final
void
|
wait()
|
final
void
|
wait(long arg0, int arg1)
|
final
void
|
wait(long arg0)
|
|
From interface
java.io.Closeable
|
Public Constructors
public
CloseableThreadLocal
()
Public Methods
public
void
set
(T object)
Protected Methods
protected
T
initialValue
()