ThreadLocal
ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据
调用的是ThreadLocalMap类对应的 get()、set() 、remove()方法。
最终的变量是放在了当前线程的 ThreadLocalMap 中,并不是存在 ThreadLocal 上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值
创建ThreadLocal,使用static final 避免对象的重复创建
使用完 ThreadLocal方法后 最好手动调用remove()方法,防止内存泄露
造成内存泄露的原因https://blog.csdn.net/oliver486/article/details/123798272
Entry(ThreadLocal,value)
我们是通过ThreadLocal类型的key去使用对应的value的,当Entry里某个ThreadLocal类型的key变成null的时候,实际就是我们不再使用这个ThreadLocal了,那么我们也就用不到它所对应的value了,但这个value还占着内存,这不就是内存泄露了嘛。这个value因为存在着这样一条强引用链导致不能被回收:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value。
创建一个ThreadLocal对象,并设置一个Object对象,然后将其置空。如果Key不是弱引用的话,threadLocal无法被回收,也无法被访问,object无法被回收,也无法被访问,Key和Value同时出现了「内存泄漏」

浙公网安备 33010602011771号