为什么threadLoacl要设计改为thread类里面有threadLocalMap?
为什么threadLoacl要设计改为thread类里面有threadLocalMap,然后map里面key为threadLoacl,value为value,而不是一个threadLoaclMap里面根据thread当key呢。
其实在早起jdk版本就是用后者,后来改成了前者。
主要原因:
1、减少hash冲突。这样把每个thread分多个map,可以减少每个map的存储数据,从而提高查询效率。
2、节省内存。最主要的还是因为thread里面放map,可以在thread销毁的时候自动删除map和里面的threadLocal这些,更节省内存。
ThreadLoaclMap到底是什么结构?
threadLoaclMap其实不是map,而是threadLoacl里面的内部类,map里面有个entry对象,就是key和value的形式,这个key定死了只能是threadloacl对象,而且是弱引用,为了让线程的生命周期和threadlocal解绑,下面会说。
Threadlocal的弱引用(重点)
Threadlocal的内存泄漏其实跟弱引用没有关系,不管key是不是弱引用,他的value都会发生内存泄漏的,如果没有remove掉entry对象的话,所以如果我们用完threadlocal记得romove掉,要不然就只能等thread类销毁,然后他的map这些都会销毁了,用了线程池是很难达成的。
为什么key需要弱引用
因为threadlocal源码中的get、set方法里会对如果key为null,value也为null这种操作,是可以来防止内存泄露的,也就是当年让家remove掉entry的时候,弱引用其实可以提供一个保障