1,内存泄漏或产生脏数据
(1)使用ThreadLocal时,会在线程的私有的Map对象中存储对应的变量值Value,对应的key为ThreadLocal对象本身。当线程为普通线程执行完逻辑就销毁时,
Map对象会被回收,当线程为线程池线程时,执行完任务后,线程并没有销毁所以Map对象任然存在,且里面的内容Value没有被删除。执行的次数多了后,就会产生内存泄漏。
(2)当线程再次使用之前的ThreadLocal对象获取值时能获取到对应的Value,但这个值是上一次设置进去的,本次并没有设置Value值。所以也会产生脏数据。
2,inheritableThreadLocals 是主线程创建子线程时,会同步拷贝一个到子线程对应的inheritableThreadLocals对象里面。子线程可以拿到父线程在里面设置的值。
3,线程对象由两个Map对象,threadLocals,和inheritableThreadLocals 当ThreadLocal对象为ThreadLocal时set和get的对象是threadLocals(Map),当ThreadLocal对象
是InheritableThreadLocal时,set和get的对象是inheritableThreadLocals 。
原文:https://www.cnblogs.com/huacheng/p/12609435.html