目录
1.为什么要解析threadlocal
因为经常用。。。特别的重要
2.threadlocal 有什么用?
作为每个线程 独有的本地缓存使用。。。比如用在 用户登录后保存的用户信息等
3.简单示例 主要就是 set ,get方法
package com.imooc.controller.jdk;
import com.imooc.service.impl.RedisServiceImpl;
/**
* @description:
* @author: yk
* @time: 2022/5/31 9:01
*/
public class ThreadLocalTest {
private ThreadLocal<String> threadLocal=new ThreadLocal<>();
public static void main(String[] args) {
ThreadLocalTest threadLocalTest=new ThreadLocalTest();
ThreadLocal<String> threadLocal = threadLocalTest.getThreadLocal();
threadLocal.set("ss");
System.out.println(threadLocal.get());
}
public ThreadLocal<String> getThreadLocal() {
return threadLocal;
}
public void setThreadLocal(ThreadLocal<String> threadLocal) {
this.threadLocal = threadLocal;
}
}
4.源码解析
4.1)set方法
public void set(T var1) {
Thread var2 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
if (var3 != null) {
var3.set(this, var1);
} else {
this.createMap(var2, var1);
}
}
可以看出内部是 ThreadLocalMap在维护,再去 ThreadLocalMap 看看
可以看出 里面又维护了 Entry[] ,再去看看 Entry
可以看出 Entry 是继承弱引用的。key 就是threadlocal,这里给包裹了一层 变成弱引用。方便垃圾回收。。。
综上所述 可以总结下
thread---》ThreadLocalMap --》Entry ---》(key,value)
5.内存泄漏问题
5.1)可以看出 threadlocal 中 key是 包装成 弱引用,就是为了 垃圾回收的时候进行回收。但是如果写成强引用 垃圾就不会进行回收,造成内存泄漏
类似写成这样 就会垃圾回收(不一定跑通)
但是如果写成强引用类型 就不会垃圾回收
5.2)value 也可能发生内存泄漏,比如在线程池中 如果线程一直不结束,value可能会内存泄漏
。。。不演示了
6.内存泄漏如何解决
threadLocal.remove();
每次用完记得调用这个方法即可!