ThreadLocal 与 弱引用与 内存泄漏

it2026-02-17  8

ThreadLocal

                 threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,使用方法也很简单

static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get()

例子代码

public class ThreadLocalTest { public static void main(String[] args) { ThreadLocalTest test = new ThreadLocalTest(); test.setDate(); System.out.println("setDate 这时候tl已经被释放,因为是弱引用所以不会有内存泄漏,t1会被回收"); //当main执行完,当前线程 的 } public void setDate() { //强引用了ThreadLocal ThreadLocal<String> tl = new ThreadLocal<>(); /* set操作放数据 * 像当前Thread线程中的threadLocals中新建了一个ThreadLocalMap * 并将k v 放到这个map中 k是 上面的tl value是 string的"数据"的两个字 * key 弱引用了 ThreadLocal value 强引用了数据 */ tl.set("数据"); System.out.println(tl.get()); //移除当前线程threadLocals中的ThreadLocalMap的k/v数据,避免内存泄漏 tl.remove(); System.out.println(tl.get()); } }

tl.set方法如图

public void set(T value) { Thread t = Thread.currentThread(); /*取得当前线程,获取到当前线程的threadLocals 这里threadLocals的类型是和ThreadLocal 在一个文件中的ThreadLocalMap 类*/ ThreadLocalMap map = getMap(t); if (map != null) //这里的this指的是外面调用set方法的tl 也就是threadLocal map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } map使用了Entry而 Entry extends WeakReference<ThreadLocal<?>> 继承虚引用的

图解引用关系

为什么是虚引用?什么情况下会导致内存泄漏?

虚引用(每次GC都会被回收)

1 当setDate方法调用后  tl引用 TreadLocal的引用就会消失

2 如果ThreadLocalMap的key引用的TreadLocal 是强引用,TreadLocal不会被GC会导致内存泄漏

3 弱引用后TreadLocal 下次GC就会被回收

4 key为null 会导致value 内存泄漏不会被回收!所以set之后不用了必须要执行remove方法

 

最新回复(0)