threadLocalMap理解
threadLocal和threadLocalMap:
用途:放入到threadlocalMap对象中,同一个线程thread在任何地方都可以拿出来
理解(参考源码):
每个线程thead对象具有一个自己的threadLocalMap对象
threadLocalMap类的定义在threadLocal类中,是threadLocal类的静态内部类,属于threadLocal类,而不是属于threadLocal对象
在threadLocal类中的方法创建threadLoalMap对象,赋予给thread对象(若thread对象中已有threadLocalMap对象,则直接取即可)
threadLocalMap对象的元素entry的key是threadLocal对象,value是需要存储的数据,可以具有多个threadLocal对象(多个不同key)及对应的value数据
entry的key是一个弱引用的ThreadLocal对象(弱引用对象存活到下一次垃圾回收发生前),所以垃圾回收之前会清除entry对象的key,则会出现key为null的entry,但value所占内存不会释放,则可能会出现内存泄露(无法释放已申请的内存空间),最终导致内存溢出(没有内存可以分配给新的对象)。在ThreadLocal类的get()、set()、remove()方法,均有实现回收 key 为 null 的 Entry 的 value所占的内存。所以为了防止内存泄露,当线程任务不会再用ThreadLocal对象的末尾,调用一次上述三个方法的其中一个即可。个人理解其实线程死亡时会回收所有内存。
//注意,在web中,由于tomcat线程重用,如果用户信息存在threadLocalMap对象中,则一个请求结束后必须要清空
附:
强引用: 不会被回收的内存。
软引用: 内部不足的时候回收的内存。
弱引用: 存活到垃圾回收前的内存。