ThreadLocal简介

发布时间 2023-08-18 21:02:40作者: zhanggangde

ThreadLocal简介

    ThreadLocal又叫做线程变量,即ThreadLocal的填充变量都是属于当前线程的,这个线程的变量对其他线程的变量来说是访问不到的。

ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

    ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景

如下图所示

 ThreadLocal会存在内存泄露的问题嘛?

   答案是肯定会的

  ThreadLocal 的set 赋值会调用会首先获取当前的线程thread并获取thread线程中的threadMap属性,如果map不为空则更新,为空则赋值为value

又因为threadMap中使用的key为ThreadLocal弱引用。

   弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。

解决

    remove方法,直接将ThrealLocal 对应的值从当前相差Thread中的ThreadLocalMap中删除

   所以如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,这样一来 ThreadLocalMap中使用这个 ThreadLocal 的 key 也会被清理掉。但是,value 是强引用,不会被清理,这样一来就会出现 key 为 null 的 value。