Thread,ThreadLocal,ThreadLocalMap 关系
Thread
Thread
类代表了Java中的线程。在Java多线程编程中,每个线程都是通过Thread
类的实例来创建和管理的。线程是操作系统的基本单位,Java虚拟机(JVM)通过映射到宿主操作系统的线程来实现Java线程。Thread
类提供了控制线程的方法,比如启动(start()
)、运行(run()
)、中断(interrupt()
)等。
ThreadLocal
ThreadLocal
类用于创建线程局部变量。所谓线程局部变量,指的是每个线程都有自己独立的变量副本,一个线程设置或更改其副本的值不会影响到其他线程中的副本。ThreadLocal
提供了一种访问某个变量的方式,使得这个变量在每个线程中都有自己的独立副本,从而避免了线程之间的数据冲突。使用ThreadLocal
非常适合实现线程安全的设计,因为它为每个线程提供了独立的变量副本。
ThreadLocalMap
ThreadLocalMap
是ThreadLocal
的内部类,它实际上是一种特殊的Map,用于存储线程局部变量。每个Thread
对象内部都维护了一个ThreadLocalMap
实例,这个实例用于存储当前线程的线程局部变量。ThreadLocalMap
的键是ThreadLocal
对象,而值则是线程局部变量的值。当使用ThreadLocal
的get()
或set()
方法时,实际上是在当前线程的ThreadLocalMap
中存取变量。
它们之间的关系
- 每个
Thread
对象内部都有一个ThreadLocalMap
的引用,这个ThreadLocalMap
专门用来存储该线程的线程局部变量(即ThreadLocal
变量)。 ThreadLocal
对象通过get()
和set()
方法来访问当前线程的线程局部变量。当这些方法被调用时,ThreadLocal
会在当前线程的ThreadLocalMap
中进行相应的操作。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里面获取,通过这样让每个线程都拥有了自己独立的变量。