浅析ThreadLocal

ThreadLocal是Java中的线程局部变量,它为每个线程提供独立的副本,避免并发问题。ThreadLocal内部通过ThreadLocalMap存储变量,使用弱引用作为key,可能导致内存泄漏。当线程结束后,若ThreadLocal没有被外部强引用,将在GC时被回收,但value仍可能残留导致内存泄漏。
摘要由CSDN通过智能技术生成

        ThreadLocal是本地线程变量,多线程访问同一个共享变量的时候容易出现并发问题,而使用ThreadLocal变量后,访问这个变量的每一个线程都会有这个变量的一个副本,操作的也是自己本地内存中的变量。

        ThreadLocal其实是一个工具类,实际存放本地变量的是Thread类中的一个叫threadLocals的变量,它是ThreadLocalMap类型的,而ThreadLocal本身内部也维护了一个ThreadLocalMap,这个ThreadLocalMap是一个静态内部类,我们使用的get()、set()其实都是调用这个ThreadLocalMap的get()、set()方法,像get()方法的话,它是先去获取当前Thread线程类里面的那个threadLocals变量,但是这个变量默认是null,它只有当第一次调用set()方法的时候,才会去new一个ThreadLocalMap,然后进行get()、set()操作。

        这个ThreaadLocalMap内部实际上是一个Entry数组,这个Entry本身也是一个静态内部类,继承了弱引用WeakReference,当前ThreadLocal的引用就是被传递到WeakReference的构造函数中,所以ThreadLocalMap的key就是当前ThreadLocal的弱引用,value就是set()时候设置的值,为强引用,所以如果当前线程还存在,同时这个ThreadLocal变量也没有其他强依赖,那么在发生下一次GC的时候,ThreadLocalMap的key弱引用就会被回收,而value强引用不会被回收,然后就会有一个key为null,value不为null的Entry,就有可能造成内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值