JUC
ThreadLocal 源码分析

Thread,ThreadLocal,ThreadLocalMap 关系

Thread

Thread类代表了Java中的线程。在Java多线程编程中,每个线程都是通过Thread类的实例来创建和管理的。线程是操作系统的基本单位,Java虚拟机(JVM)通过映射到宿主操作系统的线程来实现Java线程。Thread类提供了控制线程的方法,比如启动(start())、运行(run())、中断(interrupt())等。

ThreadLocal

ThreadLocal类用于创建线程局部变量。所谓线程局部变量,指的是每个线程都有自己独立的变量副本,一个线程设置或更改其副本的值不会影响到其他线程中的副本。ThreadLocal提供了一种访问某个变量的方式,使得这个变量在每个线程中都有自己的独立副本,从而避免了线程之间的数据冲突。使用ThreadLocal非常适合实现线程安全的设计,因为它为每个线程提供了独立的变量副本。

ThreadLocalMap

ThreadLocalMapThreadLocal的内部类,它实际上是一种特殊的Map,用于存储线程局部变量。每个Thread对象内部都维护了一个ThreadLocalMap实例,这个实例用于存储当前线程的线程局部变量。ThreadLocalMap的键是ThreadLocal对象,而值则是线程局部变量的值。当使用ThreadLocalget()set()方法时,实际上是在当前线程的ThreadLocalMap中存取变量。

它们之间的关系

  1. 每个Thread对象内部都有一个ThreadLocalMap的引用,这个ThreadLocalMap专门用来存储该线程的线程局部变量(即ThreadLocal变量)。
  2. ThreadLocal对象通过get()set()方法来访问当前线程的线程局部变量。当这些方法被调用时,ThreadLocal会在当前线程的ThreadLocalMap中进行相应的操作。
  3. ThreadLocalMap使用ThreadLocal实例作为键,线程局部变量的值作为值,从而实现每个线程对其线程局部变量的独立存取。

总结

threadLocalMap实际上就是一个以threadLocal实例为key,任意对象为value的Entry对象。当我们为threadLocal变量赋值,实际上就是以当前threadLocal实例为key,值为value的Entry往这个threadLocalMap中存放

总结

ThreadLocalMap从字面上就可以看出这是一个保存ThreadLocal对象的map(其实是以ThreadLocal为Key),不过是经过了两层包装的ThreadLocal对象:

JVM内部维护了一个线程版的Map<Thread,T>(通过ThreadLocal对象的set方法,结果把ThreadLocal对象自己当做key,放进了ThreadLoalMap中),每个线程要用到这个T的时候,用当前的线程去Map里面获取,通过这样让每个线程都拥有了自己独立的变量