ThreadLocal是一个数据结构,有点像HashMap,可以保存key-value键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。ThreadLocal为变量在每个线程中都创建一个副本。
在线程1中初始化了一个ThreadLocal对象localName,并通过set方法,保存一个占小狼的值,get方法可以拿到之前设的值,但是如果在线程2中,拿到的将是一个null。
下面是set和get的源码:
可以发现每个线程中都有一个ThreadLocalMap数据,当执行set方法时,其值保存在当前线程的threadLocalMap变量中,在第一次调用set方法时,创建ThreadLocalMap。Set方法本质上是调用了ThreadLocalMap的set方法。当执行get方法,是从当前线程的ThreadLocalMap变量获取。所以在线程1中set的值,对线程2来说是摸不到的。
什么是ThreadLocalMap?
ThreadLocalMap类似HashMap,但并没有实现Map接口。ThreadLocalMap中也是初始化一个大小16的Entry数组,Entry对象用来保存每一个key-value对。这里的key永远是ThreadLocal对象。Entry继承于WeakReference,Entry中没有next字段,所以不存在链表的情况了。
这样的话,在get的时候,也会根据ThreadLocal对象的hash值,定位到table中的位置,然后判断该位置Entry对象中的key是否和get的key一致,如果不一致,就判断下一个位置
标签:set,get,ThreadLocalMap,ThreadLocal,线程,Entry From: https://www.cnblogs.com/MarkLeeBYR/p/16716222.html