使用ThreadLocal注意事项

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  。

posted on 2020-03-31 23:10  xiangoffice  阅读(1904)  评论(0编辑  收藏  举报

导航