介绍一下 ThreadLocal

大家好我是苏麟 , 今天带来一道 ThreadLocal 的题 .


ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
ThreadLocal是以ThreadLocal对象为Key,任意对象为值的存储结构(其底层是在线程里维护了一个map,map的key就是各种ThreadLocal对象),当一个Key-Value值被存储之后,会一直附带在线程上,所以你可以在线程执行的任何位置再通过这个ThreadLocal对象取到存入的一个值。另外设定或修改值的方式是SET(T),获取值的方式是get();


Thread类下 有两个 ThreadLocal.ThreadLocalMap 变量 , 它们默认为 null ,只有当该线程调用了ThreadLocal类的get/set方法时才会创建他们

ThreadLocalMap 是 ThreadLocal 的内部类 , ThreadLocalMap 不是 Map的实现类而是 里面维护一个Key-Value的数组

而调用ThreadLocal的get/set实际上是调用ThreadLocalMap的get/set

用一个场景分析ThreadLocal的get/set流程:
首先在所有线程外部创建一个共享的ThreadLocal对象,记为TL1。在一个线程中调用TL1.get()时,首先获取到当前线程对象,记为t,然后判断t.threadLocals是否为nul,如果为nul,就在t中创建一个新的ThreadLocalMap对象赋值给t,threadLocals,并将<TL1,null>插入其中,最后get方法返回null;如果不为null,则尝试获取threadLocals中TL1所在的键值对,如果该键值对为null,则向threadLocals中通过set方法插入<TL1,null>,最后返回nul,如果键值对不为null,则返回键值对中的值。调用set方法时,流程和get基本一致,只是从读变成了写。这样就可以实现不同线程访问同一个ThreadLocal(TL1)能拿到各自向其中存放的值


 三篇文章 让你彻底掌握 ThreadLocal .

Java中的ThreadLocal-CSDN博客

内存泄漏——为何每次用完 ThreadLocal 都要调用 remove()?-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值