基本原理
ThreadLocal 为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。这样在多线程环境下,各个线程对 ThreadLocal 变量的操作相互隔离,避免了线程安全问题。
底层实现机制
ThreadLocalMap:ThreadLocal 内部使用 ThreadLocalMap 来存储线程局部变量。ThreadLocalMap 是 ThreadLocal 的一个静态内部类,它类似于 HashMap,用于将 ThreadLocal 对象与线程的局部变量进行关联。每个 Thread 对象都有一个 ThreadLocalMap 类型的成员变量 threadLocals,当线程通过 ThreadLocal 设置变量时,实际上是将变量存储在该线程的 threadLocals 中。
哈希冲突解决:ThreadLocalMap 采用开放地址法来解决哈希冲突。当计算出的哈希值对应的数组位置已经被占用时,会通过线性探测的方式寻找下一个空的位置来存储数据。例如,若当前 ThreadLocal 的哈希值与另一个已存在的 ThreadLocal 的哈希值发生冲突,那么就会在数组中向后查找,直到找到一个空的位置来存放当前 ThreadLocal 对应的键值对。
Entry 对象:ThreadLocalMap 中的键值对是以 Entry 对象的形式存在的。Entry 继承自 WeakReference<ThreadLocal<?>>,这意味着 Entry 中的键(ThreadLocal 对象)是弱引用。当 ThreadLocal 对象在其他地方不再被强引用时,在垃圾回收时就会被回收,从而避免了内存泄漏。但是,如果 Entry 中的值没有被及时清理,仍然可能导致内存泄漏,所以在使用 ThreadLocal 时,需要及时调用 remove 方法来清除不再需要的变量。