1:结构
-
每个thread都维护了一个自己的threadLocals变量,每个线程的数据是存在了自己的threadLocal中的
-
ThreadLocalMap
-
static class Entry extends WeakReference<ThreadLocal<?>>
-
一个线程中,可以由多个threadLocal来存放不同类型的对象,将他们都放在threadLocalMap中,所以需要数组
-
int i = key.threadLocalHashCode & (len-1);
-
如果key相等,那么写入value,key不存在,就直接写入,如果冲突,就寻找下一个位置。
-
load factor 是2/3
-
2:共享数据
- 当创建threadlocal的时候,如果线程自身的inherit不为空,并且父线程的inheritlocal也存在,那么我就把父进程给子进程
private void test(){
// 使用inherit继承类
final ThreadLocal threadLocal = new InheritableThreadLocal();
threadLocal.set("我是 菜鸡");
Thread t = new Thread(){
@Override
public void run() {
super.run();
System.out.println("我是菜鸡吗?? "+ threadLocal.get());
}
};
t.start();
}
3:内存泄漏
- map中的key是弱引用,而弱引用在任何时候被GC扫描到,就会回收
- 而value 迟迟得不到回收,就会造成内存的泄漏
- remove掉就好