Java中的ThreadLocal
本文记录了一些关于ThreadLocal相关的个人理解
1.Thread,ThreadLocal,ThreadLocalMap三者的关系?
上面的代码是Thread类的源码,Thread类有一个实例变量,名叫threadLocals,它是ThreadLocalMap类型,同时它又是ThreadLocal的静态类。也就是说,每一个线程都有一个ThreadLocalMap,这个类实现的功能其实就是一个哈希表
ThreadLocal类中,提供了一系列操作,如get,set,remove等,这些操作全部是在线程的ThreadLocalMap上进行的,换句话说,存储数据的是Thread类中的ThreadLocalMap,操作数据的是ThreadLocal,ThreadLocal本身并不存储数据
比如get操作,通过getMap来获取当前运行线程的threadLocals(变量的类型为ThreadLocalMap,也就是上面提到的存储数据的哈希表)。
注意到map.getEntry(this)中传入了this指针,也就是当前ThreadLocal实例的引用,因此除了操作数据之外,ThreadLocal的另一个作用是提供hash地址
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
2.ThreadLocal如何保证不同线程存取的是某个线程自己的本地数据?
ThreadLocal的地址是不变的,变的是不同线程的ThreadLocalMap,因此在存取的过程中,对于同一个ThreadLocal,不同线程的ThreadLocalMap用相同的Key(同一个ThreadLocal的引用)存取到了不同的值(各自的Value)
具体细节推荐看这里 https://zhuanlan.zhihu.com/p/61587053