ThreadLocal
1.是什么
一个存储结构,可以定义一个变量,每一个线程都可以拥有这个变量的副本,每个线程对于这个变量的修改,都只在本线程内有效,让共享变量不会出现多线程问题
2.内部结构
底层由一个Entry数组构成,key的类型为弱引用,(弱引用,只能生存到下一次gc前,由次可能发生内存泄漏问题),value为set传入的值。不同的线程会有不同的threadmap,而key的值为当前threadlocal,一个线程有多个threadlocal时,就会根据不同的threadlocal对象的hash值确定不同的数组坐标。
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
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);
}
3,内存泄漏
因为threadlocal中存储值的Entry数组中的key的类型为弱引用,而弱引用根据虚拟机规则,在垃圾回收时会直接回收,当前线程还存在时,导致数组中一个元素的key为null,而value不为null,get方法也无法访问到,业绩导致了内存泄漏(这个值无法使用也没有回收)。