ThreadLocal 以空间换时间来实现线程隔离,解决多线程中相同变量的访问冲突问题,保证了别的线程不会访问到线程内的变量。
1.每一个线程对应一个ThreadLocalMap
在使用 ThreadLocal 时(get/set 方法
),会为当前线程 Thread 类中的threadLocals
创建ThreadLocalMap
对象。之后,如果当前线程使用 ThreadLocal 直接获取 Thread 类的threadLocals
对象。
源码可见:
①ThreadLocal -> get() -> setInitialValue() -> createMap(t, value)
②ThreadLocal -> set(T value) -> createMap(t, value)
2.ThreadLocal 是如何定位获取数据的
在 ThreadLocalMap 中,使用table[]
数组存储数据,ThreadLocal 主要通过threadLocalHashCode
计算数组索引,来获取数据。
int i = key.threadLocalHashCode & (table.length - 1);