面试题答案
一键面试ThreadLocal工作原理
- 数据结构:
ThreadLocal
内部维护了一个ThreadLocalMap
,这是一个定制化的哈希映射。ThreadLocalMap
由一个个Entry
数组构成,Entry
继承自WeakReference<ThreadLocal<?>>
。每个Entry
存储一个键值对,键是ThreadLocal
实例的弱引用,值是对应线程的本地变量副本。
- 为每个线程提供独立数据副本:
- 当调用
ThreadLocal
的set(T value)
方法时,首先获取当前线程Thread.currentThread()
,然后从该线程对象中获取对应的ThreadLocalMap
。如果ThreadLocalMap
不存在,则创建一个新的。接着以当前ThreadLocal
实例作为键,将传入的值作为值,放入ThreadLocalMap
中。 - 当调用
ThreadLocal
的get()
方法时,同样先获取当前线程,再从线程中获取ThreadLocalMap
。如果ThreadLocalMap
存在,则以当前ThreadLocal
实例作为键去查找对应的值并返回。如果ThreadLocalMap
不存在或者找不到对应的值,会调用initialValue()
方法来初始化值(默认返回null
)。
- 当调用
- 在多线程环境下保证线程安全:
ThreadLocal
保证线程安全的核心在于每个线程都有自己独立的ThreadLocalMap
,不同线程之间的数据存储和访问相互隔离。一个线程对自己ThreadLocalMap
中的数据进行操作,不会影响其他线程的ThreadLocalMap
。因此,在多线程环境下,每个线程访问和修改自己的本地变量副本,不会出现竞争条件,从而保证了线程安全。
总结来说,ThreadLocal
通过让每个线程持有自己独立的数据副本,利用ThreadLocalMap
这种数据结构,在多线程环境下有效地避免了数据竞争,保证了线程安全。