-
ThreadLocal 并不是一个Thread
-
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问
-
ThreadLocal,即线程本地变量
-
当创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题
-
实现原理
-
每个线程都有一个属于自己的ThreadLocalMap
-
ThreadLocalMap内部维护着Entry数组,每个Entry代表一个完整的对象,key是ThreadLocal本身, value是我们设置的值
-
每个线程在往ThreadLocal里设置值的时候,都是往自己的ThreadLocalMap里存,读也是以ThreadLocal作为key,在自己的map里找对应的key,从而实现了线程隔离
-
-
内存泄漏
-
ThreadLocalMap中使用的 key为 ThreadLocal 的弱引用
-
弱引用:只要垃圾回收机制一运行,不管M的内存空间是否充足,都会回收该对象占用的内存
-
如果ThreadLocal不再被引用,当JVM GC时就会被垃圾回收器回收(ThreadLocalMap的Key),但是因ThreadLocalMap生命周期和Thread是一样的,它这时候如果不被回收,就会出现这种情况:ThreadLocalMap的key为null,value还在,这就会造成了内存泄漏问题
-
-
解决threadLocal潜在的内存泄漏的问题
-
若发现ThreadLocalMap某entry key为null,则将entry value和其entry本身都设置为null,下一次GC的时候就会被回收
-
08-21
1990
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-05
8万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交