ThreadLocal学习

ThreadLocal简介

ThreadLocal是线程变量;其中的变量只属于当前线程,线程之间能够隔离,保证了线程安全。同一个ThreadLocal包含的对象在不同线程中有不同的value,这一value只能在同一线程中使用。

ThreadLocal通常在创建时用private static修饰,在同一线程中可以调用此变量。

ThreadLocal工具类编写

class ThreadLocalUtil(){

    //利用此threadLocal缓存String类型数据
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
    
    public static void set(String s){
        threadLocal.set(s);
    }

    public static void get(){
        threadLocal.get();
    }

    public static void remove(){
        threadLocal.remove();
    }
}

利用此工具类可以实现不同方法中对同一ThreadLocal的调用,实现对数据的缓存及获取。

ThreadLocal实现原理

通过ThreadLocal内部静态类ThreadLocalMap来实现对数据的存储。

一个线程中只有一个ThreadLocalMap,其生命周期与该线程一致,线程死亡则ThreadLocalMap消失,ThreadLocalMap中存储ThreadLocal。具体如下:

ThreadLocalMap为一个Map,其key(左边列)是某一ThreadLocal变量的地址,value(右边列)是该ThreadLocal存储的数据(若还未设置则为一个初始值)。

当执行ThreadLocal.set(val)时,方法会先得到当前线程,然后去ThreadLocalMap中找,若此时map为空,则创建一个ThreadLocalMap,并将当前线程和所附的值放入其中;不为空时,找到当前线程的ThreadLocalMap,在其中插入(ThreadLocal,val)。

当执行ThreadLocal,get()方法时,得到当前线程,去对应的ThreadLocalMap中查找当前ThreadLocal,得到其val,若在这之前没有set操作,则会返回一个初始值。

当执行ThreadLocal.remove()方法时,同理前往当前线程的ThreadLocalMap进校remove操作。

ThreadLocal需要注意的问题

内存泄漏:当此threadLocal线程变量没有及时回收时,可能会出现内存泄漏的问题;因此要记得在使用完后进行remove操作

弱引用:ThreadLocalMap对(ThreadLocal,val)的存储,是将其存储为弱引用的entry。entry的key弱引用指向某个ThreadLocal,当使用完毕后,弱引用会自动回收,此时若没有进行remove,则会出现key为null但val仍有值的情况,出现内存泄漏。

强引用:当前Thread指向ThreadLocalMap以及ThreadLocalMap指向ThreadLocacl都为强引用,因此不会被回收。

参考:​​​​​​https://blog.csdn.net/y5492853/article/details/123984840?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-123984840-null-null.pc_agg_new_rank&utm_term=threadlocal%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F&spm=1000.2123.3001.4430

获取当前线程中所有的ThreadLocal

可以使用反射进校获取:

代码参考:

https://blog.csdn.net/goldenfish1919/article/details/108625307?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-108625307-null-null.pc_agg_new_rank&utm_term=%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E7%BA%BF%E7%A8%8B%E7%9A%84threadlocal&spm=1000.2123.3001.4430

参考资料:

​​​​​​https://blog.csdn.net/y5492853/article/details/123984840?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-123984840-null-null.pc_agg_new_rank&utm_term=threadlocal%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F&spm=1000.2123.3001.4430

https://www.csdn.net/tags/MtTaIgzsODQxMzMtYmxvZwO0O0OO0O0O.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值