网上有很多关于ThreadLocal的介绍,有的介绍比较简单,也有的介绍很复杂,比较难懂,今天,自己结合它的源码,也做个简易梳理,记录如下!
ThreadLocal的作用
在多请求并发访问过程中,我们往往需要将一个指定变量隔离起来,达到只对当前线程可用,其他线程不可用的效果,因此,我们就会使用到ThreadLocal来实现。
实现原理其实就是在每个线程中维护了一个Map结构(ThreadLocalMap,它是ThreadLocal中的静态内部类),ThreadLocal对象为Key,需要隔离的值为Value。为了达到线程全局可用,我们往往将ThreadLocal声明为全局静态变量。
Thread中的ThreadLocalMap对象
/* ThreadLocal values pertaining to this thread. This map is maintained
- by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;
那么ThreadLocal具体如何做到线程隔离的?我们下面做具体分析!
ThreadLocal
ThreadLocal的生命周期图示如下:
我们暂不分析ThreadLocalMap,先单独来看ThreadLocal的几个方法源码介绍!
1.对象初始化
ThreadLocal初始化比较简单!
public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>();
我们往往在初始化时会给他指定一个默认值,不指定的话,默认值为null,这里有两种指定方式:
第一种:直接复写ThreadLocal中的initialValue方法
第二种:利用函数式编程,创建SuppliedThreadLocal对象,由get方法直接返回初始值
public static final ThreadLocal THREAD_LOCAL = new ThreadLocal(){
@Override
protected String initialValue() {
return “Test”;
}
};
public static final ThreadLocal THREAD_LOCAL = ThreadLocal.withInitial(()->“Test”);
SuppliedThreadLocal对象是对ThreadLocal的一个特定实现,通过构造函数传入Supplier,再由实现的initialValue方法返回supplier.get()的结果,其他也没什么可多介绍的。
2.获取变量
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLo