ThreadLocal原理及使用的时候有什么需要注意的

ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量(反射可以)。

ThreadLocalMap内部是一个Entry数组,Entry继承自WeakReference,Entry内部的key就是ThreadLocal本身value是ThreadLocal的set方法传递的值(ThreadLocal的value)

ThreadLocal作为key被传递到了WeakReference的构造函数里面(super(k)),也就是说ThreadLocalMap里面的key为ThreadLocal对象的弱引用

所以,可能造成内存泄漏。

避免内存泄漏的方法是,必须调用ThreadLocal的remove()方法

既然弱引用导致了内存泄漏,为什么还使用弱引用?

假设 key 使用强引用:引用的ThreadLocal的对象被回收了,但是ThreadLocalMap还持有ThreadLocal的强引用,如果没有手动删除,ThreadLocal的引用不会被回收,导致内存泄漏(引用的对象被回收,但引用还在)。

现在 key 使用弱引用:引用的ThreadLocal的对象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使没有手动删除,ThreadLocal也会被回收(引用及引用的对象均被回收,保证ThreadLocal的引用被回收,是一个进步)。

其实ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。所以最好的办法就是remove

常用于:数据库连接、Session管理等

猜你喜欢

转载自blog.csdn.net/qq_43778308/article/details/111239008
今日推荐