java中ThreadLocal使用
文章目录
一、简介
ThreadLocal是java线程中的局部变量,变量作用域仅在当前线程有效,是线程安全的。ThreadLocal常用于在多线程中,各自线程保存自己私有的变量值,如会话管理等场景。
二、使用
ThreadLocal类定义及常用方法如下:
public class ThreadLocal<T> {
protected T initialValue() //初始化方法,protected方法,用于子类重写;
public void set(T value) //设置值;
public T get() //获取值;
public void remove() //清空值。当线程回收时,局部变量也会自动回收,主动调起是非必须操作,只是加快回收速度;
}
三、原理
ThreadLocal在多线程中是线程安全的,原因是在每个线程中,都维持着自己私有的类型为ThreadLocal.ThreadLocalMap的变量threadLocals。
3.1 Thread类
Thread类关键源码:
//Thread类中threadLocals变量, 维护在ThreadLocal中
ThreadLocal.ThreadLocalMap threadLocals = null;
即是Thread类每个实例都有自己独立的threadLocal变量,理所当然线程是安全的。
3.2 ThreadLocal类
3.2.1 主要方法
TheadLocal类的主要操作方法源码如下:
//获取值
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();
}
//初始化
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map