当我们自己的程序所运行的Thread 非我们自己New的。但我们想绑定一些对象给这些线程,怎么办。
LocalStorage来帮忙,我们可以将多个对象绑定到当前线程。
class c1{
ThreadLocal<String> tl1= new ThreadLocal();
ThreadLocal<String> tl2= new ThreadLocal();
public method1(String in_str1,String int_str2) {
tl1.set(in_str1);
tl2.set( in_str1);
}
}
ThreadLocal 源码
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocalMap 源码
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
Entry
static class Entry extends WeakReference<ThreadLocal<?>>
Thread
ThreadLocal.ThreadLocalMap threadLocals = null;
每个 Thread 有一个ThreadLocalMap(map) 叫 threadLocals(注意是复数),是强引用,这个map的每一entry的key 是一个WeakReference,可以被gc掉的,哪怕当前线程是活的,这个key运行时就是tl1或者tl2 ,如果是Strong Reference(比如普通的HashMap),会造成memory leak,因为1.我们不能控制线程的结束和2.这个map在Thread实例是强引用。线程的生命周期是由容器比如tomcat控制的。