概念
ThreadLocal
是Java
的一个类,是一个本地线程,提供了一种线程安全的方式,主要用来避免共享数据(线程变量隔离)。
有时候可能要避免共享变量,使用ThreadLocal
辅助类为各个线程提供各自的实例;就是说,每个线程都有一个伴生的空间(ThreadLocal)
,存储私有的数据,只要线程在,就能拿到对应线程的ThreadLocal
中存储的值,实际上ThreadLocal
保证线程安全是一种空间换时间
的思想。
TheadLocal的使用场景和注意事项
ThreadLocal
在Java
开发中非常常见,一般在以下情况会使用到ThreadLocal
:
- 在进行对象跨层传递的时候,可以考虑使用
ThreadLocal
,避免方法多次传递,打破层次间的约束。 - 线程间数据隔离,比如:上下文
ActionContext、ApplicationContext
。 - 进行事务处理,用于存储线程事务信息。
在使用ThreadLocal
的时候,最常用的方法就是:initialValue()、set(T t)、get()、remove()
。
创建以及提供的方法
创建一个线程局部变量,其初始值通过调用给定的提供者(Supplier)生成;
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {
return new SuppliedThreadLocal<>(supplier);
}
// InitialValue()初始化方式使用Java 8提供的Supplier函数接口会更加简介
ThreadLocal<String> userContext = ThreadLocal.withInitial(String::new);
复制代码
这里就列出用的比较多的方法:
将此线程局部变量的当前线程副本设置为指定值;value表示要存储在此线程本地的当前线程副本中的值
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
复制代码
返回此线程局部变量的当前线程副本中的值。 如果该变量对于当前线程没有值,则首先将其初始化为调用initialValue
方法返回的值
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
复制代码
删除此线程局部变量的当前线程值
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
复制代码
<