java中threadlocal_java中的ThreadLocal

ThreadLocal一般用来保存多个线程对共享变量的修改使得每个线程都能访问自己修改后的变量值。以前我对ThreadLocal的粗略印象就是它是一个map,具体是不是这样,怎样实现的并不清楚。遇到概念比较模糊的知识点,只有去搞懂,才能有所进步,所以下面分析一下;

一 应用:

//用ThreadLocal声明一个共享的变量

1b1fb96e6cdddc5df4143ad82eb5b898.png

//普通类中的实例变量

891f5a5c1a94113c055c88c2e50b3c31.png

1.1 测试带ThreadLocal的共享变量

b113db36162252ce66f6d4d4fdb5ce9b.png

结果:

c197f447b602bfdaad74ffe91bebf2d1.png

1.2测试普通的共享变量

42e378fde99b659becb64562749d4c0a.png

结果:

eb71fc141c453faf233122c5a1c5f939.png

分析:

在1.1和1.2,分别把一个拥有ThreadLocal变量的对象和一个普通变量的对象传个多个线程,然后修改对象中的值。1.1中每个线程所做的修改都能被记录下来,而1.2中每个线程由于共享一个对象中的变量,由于并发的原因只会记录其中的一个值。ThreadLocal的确会记录每个线程对共享变量的修改。

二 源码

ThreadLocal的类图:

b23db94900330fd553c43d07b0b7fe65.png

类中各实例变量:

final int threadLocalHashCode:用来唯一标识ThreadLocal对象的hashcode,通过该变量与对象数组中的length-1进行与操作,获取保存的对象的位置。

static AtomicInteger nextHashCode: 用来生成唯一hashcode

static final int HASH_INCREMENT: 每次新生成一个hashcode的增量

类中方法:set和get

69a2d52e7fd439b652bbaa108d516385.png

b63c1ff7dd3c1076c5c7ca2847c70313.png

22d4ed8bc45ebe4eb8528e010fb13438.png

getMap(Thread t):根据线程t获取线程的ThreadLocal.ThreadLocalMap threadLocals,ThreadLocalMap有点类似hash table,用来存储不同ThreadLocal对象所对应的值,一个线程可以存储通过多个不同的ThreadLocal操作所存储的值。

createMap(Thread t, T firstValue):创建线程t的ThreadLocalMap,并保存该ThreadLocal对象所对应的值为firstValue。

setInitialValue(): 创建该线程的ThreadLocal.ThreadLocalMap,取initialValue()初始化的值,如果map 为空则创建ThreadLocalMap并保存初始值,如果map不为空则直接替换ThreadLocalMap中该ThreadLocal对象所对应的值为初始值,最后返回初始值。

三流程

ThreadLocal存储多个线程操作值的过程如下:每个线程下都会有创建一个ThreadLocalMap,该map中保存了不同ThreadLocal所保存的值,通过操作ThreadLocalMap获取该线程下ThreadLocal对象所对应的值。ThreadLocalMap中保存对象用的是Entry包含值对象value和当前ThreadLocal引用,可能存在ThreadLocal不存在而值继续存在的情况。只有当线程结束,value的对象才能回收。所以最好就是当value不用的时候,自己remove将它释放而不是等到set或get操作(这两个操作也不一定能够收回内存)的时候以免造成内存泄漏。Entry继承了虚引用WeakReference,后面会了解一下虚引用。

6edd11364bbf621914790518948179ed.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值