: .
alMap map = getMap(t); if (map != null)
{ e = (this);
if (e != null) return (T); }
return setInitialValue(); } ThreadLocalMap
getMap(Thread t) { return ; }
get()方法的源码如上所示,可以看到 map 中真正的 key 是线
程 ThreadLocal 实例本身( e =
(this);中的 this)。可以看一下
getEntry(ThreadLocal key)的源码.
【代码 4】
private Entry getEntry(ThreadLocal key) { int i =
& ( - 1);Entry e = table[i]; if (e != null && () == key)
return e; else return
getEntryAfterMiss(key, i, e); }
那么 map 中的 value 是什么呢?我们继续来看源码:
【代码 5】
private T setInitialValue() { T value = initialValue();
Thread t = (); ThreadLocalMap
map = getMap(t); if (map != null)
(this, value); else createMap(t,
value); return value; } protected T initialValue()
{ return null; }
代码 5 中只能够观察到通过[protected T initialValue()]方法设
置了一个初始值,当然也可以通过 set 方法来赋值,继续看
源码:
【代码 6】
public void set(T value) { Thread t =
(); ThreadLocalMap map =
getMap(t); if (map != null) (this,
value); else createMap(t, value); }
ThreadLocal 设置值有两种方案:1. Override 其 initialValue 方
法;2. 通过 set 设置。
关于重写 initialValue 方法可以参考下面这个例子简便的实现:
【代码 7】
private static final ThreadLocal TIME_THREADLOCAL = new
ThreadLocal(){ ***@Override protected Long
initialValue() { return
(); } };
内存泄露
通过代码 1 和代码 2 的片段可以看出,在 Thread 类中保有
的引用,即在一个 Java 线程栈
中指向了堆内存中的一个 的对
象,此对象中保存了若干个 Entry,每个 Entry 的
key(ThreadLocal 实例)是弱引用,value 是强引用(这点类似
于 WeakHashMap)。
用到弱引用的只是 key,每个 key 都弱引用指向 threadLocal,
当把 threadLocal 实例置为 null 以后,没有任何强引用指向
threadLoca
聊一聊ThreadLocal 来自淘豆网m.daumloan.com转载请标明出处.