TreadLocal
小于 1 分钟
TreadLocal的内存泄漏问题
下图是使用TreadLocal和Tread时的引用关系图:
使用TreadLocal的逻辑如下:
- 首先创建一个TreadLocal
- 往TreadLocal中存放数据
- 取出TreadLocal中的数据,移除TreadLocalMap中的元素
我们创建的TreadLocal是static类型的,存储在一个UserContext内,这个单例对象由Spring管理,这样可以保证在存数据和取数据时,使用的是同一个treadlocal,不同的Tread有不同的TreadLocalMap,但是key都是同一个对象
在Spring中,TreadLoca不会被释放,但是如果Entry在使用后没有被手动删除,就会在这个线程运行的过程中出现内存泄漏,但是在线程结束后还是会被释放,所以内存泄漏和弱引用,强引用没有关系,和手动释放内存有关系
//ThreadLocal的get()方法
public T get() {
//先获取当前线程和线程的ThreadLocalMap
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
//然后再到这个ThreadLocalMap中使用自己作为key取值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}