线程局部变量ThreadLocal的简单使用

今天来说说ThreadLocal的使用:

什么是ThreadLocal:ThreadLocal是线程局部变量,所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量。在各个Java web的各种框架中ThreadLocal几乎已经被用烂了,spring中有使用,mybatis中也有使用,hibernate中也有使用,甚至我们写个分页也用ThreadLocal来传递参数......这也从侧面说明了ThreadLocal十分的给力。

下面看看作者Doug Lea是怎么说的,下面是jdk7.X中的注释:

  1. 也就是说这个类给线程提供了一个本地变量,这个变量是该线程自己拥有的。在该线程存活和ThreadLocal实例能访问的时候,保存了对这个变量副本的引用.当线程消失的时候,所有的本地实例都会被GC。并且建议我们ThreadLocal最好是 private static 修饰的成员

  2. ThreadLocal和Synchonized区别:

    都用于解决多线程并发访问。

    Synchronized用于线程间的数据共享(使变量或代码块在某一时该只能被一个线程访问),是一种以延长访问时间来换取线程安全性的策略;

    而ThreadLocal则用于线程间的数据隔离(为每一个线程都提供了变量的副本),是一种以空间来换取线程安全性的策略。

  3. ThreadLocal的简单方法:

    ThreadLocal有两个简单的方法,一个set()方法,一个get()方法

    简单代码应用(由于头条不保存代码格式,在这里我就直接上图片了,大家凑合着看):

ThreadLocalTest类有两个方法,一个是start方法,一个是end方法,start记录开始时间,end方法记录结束时间,这个方法可以简单的用在统计耗时的功能上,在方法的入口前执行start,在方法被调用之后调用end方法,好处是两个方法的调用不用再一个方法或者类中,比如在aop(面向切面编程)中,在方法调用前的切入点执行start方法,在方法调用之后调用end方法,这样依旧可以得到方法执行的耗时。

好,上边是简单的应用,下面我从源码的角度给大家分析一下ThreadLocal:

如果让我自己想办法的话我会将Thread和value放在一个map中,这样我们get的时候直接get(Thread)就行了,但是我们通过源码看看ThreadLocal是怎么做的:

我们看到,这里声明了一个ThreadLocalMap,我们在看getMap方法是怎么实现的:

我们看到,是返回了一个成员变量,到这貌似有了点头绪,是把ThreadMap和Thread绑了起来。

这个threadLocals是哪里来的呢?

看,是ThreadLocal帮助Thread声明了该字段。

如果是第一次调用的话ThreadLocalMap是为null的,我们在来看看createMap方法是怎么实现的:

在这里new了一个ThreadLocalMap,参数是this(就是这个线程),另一个是value,在往下看new ThreadLocalMap是怎么new 的:

看到这里就明朗了,ThreadLocalMap中的参数是ThreadLocal,并不是Thread,这就和我想的思路有差异了。

总结:就是在Thread中有一个类似于Map的东西,并且默认为空,在我们声明了ThreadLocal的时候,ThreadLocal把这个Map初始化了,并且把ThreadLocal和value绑定到了这个map中,也就是说这个map的key值是ThreadLocal,但是我在刚开始想的是将Thread当做key这样做到底有什么好处呢?

优点1:这样做把value放在了线程当中,这样线程死亡,value随之回收,而原来的方式没有放在线程中,Thread死亡的时候value不确定是不是回收,所以这个改进更加人性化了。以为value定义的初衷就是属于Thread的

优点2:性能提升了,想一想,如果按照原来的方法,把整个Thread放入到map中的话,如果放入的线程很多的话,这个map肯定会很大的,说白了就是Thread占用的空间>ThreadLocal占用的空间,空间大了,map在get的时候性能肯定是会下降的。

以上两点是我浅显的理解,可能有不足的地方,如果哪位大神觉得我说的有问题的话,欢迎指出来,小编虚心接受;

好了,以上就是简单总结的ThreadLocal的简单总结,源码的话还有别的源码,我没有列举所有,大家感兴趣的话可以自己去看看。如果觉得我的文章对你有帮助,请关注我,后续会有更好的文章,谢谢大家。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值