深入学习ThreadLocal

发布时间 2023-06-04 12:42:26作者: 傲云萧雨

1、用来干吗的?

用于线程在任意的地方去共享数据,而不被其他线程所干扰,

2、原理是什么

因为每个线程维护一份ThreadLocalMap,使用threadlocal.set(obj)方法是存放在map里面的Entry<<WeekReference>ThreadLocal,Value>数组里

3、实际案例,比如写了util类,但是SimplateDateFormate是线程不安全的,定义成成员变量多线程调用就会有问题,使用threadlocal相当于每个线程都有一份这个value,也就是simplateDateFormate对象

  

 

 4、为什么不使用thread的id作为Entry的key

当有两个ThreaLocal1和ThreadLocal2时候,在local1设置的值会被loca2中读到,但使用Threadlocal作为key就能区分

5、key为什么会设置弱引用,为什么会内存泄漏

当手动回收了ThreadLocal对象,如果是强引用,那么Entry还有一个对ThreadLocal的强引用,如果不手动删除,会导致这个Entry一直存在

从而导致内存泄漏,当使用弱引用,回收了ThreadLocal对象后,Entry里面是个弱引用,ThreadLocal就会被回收,Entry面的key变成null

在下一次get set remove就会清除掉这些key为null的数据 ,相当于提供了一层保障。

6、使用注意点

使用static修饰threadlocal修饰,当get完调用一次remove清除当此的Entry.