ThreadLocal
存取元素实际上是以当前threadlocal为key存储的,值为value存储到线程对象thread中的threadlocalmap中。
添加元素执行结束后要remove,否则如果与线程池配合使用,会导致元素一直存在线程中被占用,如果没有再次被使用既会变成内存泄漏,如果再次使用可能会有脏数据的问题。(为什么强调线程池,因为在线程池中线程才不会回收,线程如果被回收自然不会存在内存泄露)
允许设置默认值,如果当前值为空,会通过调用获取初始化值。
threadlocalmap
thread类的内部类,没有实现map接口,底层也是使用entry存储key value,通过entry数组存储多个key value。但是key固定只能是threadlocal类型,解决hash冲突的方式不是通过链地址法,而是通过开放地址法,通过位置加1的方式查找空位置,这种方式会导致冲突的几率高,降低效率,因为不适合存储过多键值对。get方法在计算hash到对应位置,发现key对不上会往后+1遍历,直到找到的位置是空的才停。需要注意的是往后找的过程如果有entry不为空,key为空的情况,会主动清除value释放,并将entry置空。避免内存泄露的手段之一
Threadlocalmap对threadlocal是弱引用,因此如果threadlocal没有被外部其他对象强引用时,在下一次垃圾回收后则会被回收。而对value是强引用的,不remove会导致内存泄漏。(不过get方法查到这个泄漏的位置会主动清除)
三者的关系
Thread -> Thr