概述
ThreadLocal
是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰。在高并发场景下,可以实现无状态的调用,适用于各个线程不共享变量值的操作。- 内部使用静态内部类
ThreadLocalMap
存储每个线程变量副本的方法,key存储的是当前线程的ThreadLocal
对象,value就是当前ThreadLocal
对应的线程变量的的副本值。
提供方法
T get()
返回此线程局部变量的当前线程副本中的值。protected T initialValue()
返回此线程局部变量的当前线程的“初始值
”。线程第一次使用get()
方法访问变量时将调用此方法,但如果线程之前调用了set(T)
方法,则不会对该线程再调用initialValue
方法。通常,此方法对每个线程最多调用一次,但如果在调用get()
后又调用了remove()
,则可能再次调用此方法。void remove()
移除此线程局部变量当前线程的值。void set(T value)
将此线程局部变量的当前线程副本中的值设置为指定值。
怎嘛使用
1 | public class ThreadLocalTest { |
源码分析
set()方法
1 | public void set(T value) { |
ThreadLocalMap
内部类
1 | static class ThreadLocalMap { |
- 源码中可以看出
ThreadLocalMap
依靠Entry
来存储ThreadLocal
和副本值,key就是ThreadLocal
,value
就是ThreadLocal
的变量副本值。Entry
集成WeakReference
,说明是一个弱引用关系。当一个对象仅仅被弱引用指向, 而没有任何其他强引用指向的时候, 如果这时GC运行, 那么这个对象就会被回收,不论当前的内存空间是否足够,这个对象都会被回收。
1 | //获取与ThreadLocal关联的Thread中的ThreadLocal。 |
ThreadLocal
是包含在Thread
类中的
ThreadLocalMap
的set
方法
1 | private void set(ThreadLocal<?> key, Object value) { |
get()操作
1 | public T get() { |