使用ThreadLocal可以为每个线程维护一个线程变量,使用场景为线程间隔离,线程内方法共享;
原理:
Thread类中有一个实例属性ThreadLocalMap,ThreadLocalMap中存放的是Entry数组,Entry数组是ThreadLocal和Object的键值对;源码如下--
Thread类:
/* * ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals;
ThreadLocal->ThreadLocalMap->Entry类:
static class ThreadLocalMap {
/**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
ThreadLocal有一个内部静态类ThreadLocalMap, ThreadLocalMap是一个Entry数组,通过map方法来访问数据,而Entry对key(ThreadLocal实例对象)的引用使用了虚引用;这里导致key可能会在JVM判断oom之前将key回收掉,导致内存泄漏-此时key对应的ThreadLocal对象被回收变成null,而value存在Thread reference->thread->threadlocalMap->entry-value的强引用链,导致无法回收;虽然在ThreadLocal的get

最低0.47元/天 解锁文章
1033

被折叠的 条评论
为什么被折叠?



