1、ThreadLocal(线程局部变量)
是什么?
线程共享变量,该变量的类型是HashMap
ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
作用:
为每一个使用该变量的线程都提供一个变量值的副本,每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突,实现线程间的数据隔离。
用于线程内跨类、跨方法传递数据。
常见用法:
1、存储单个线程上下文信息;
2、让变量线程更安全;(每个线程内部都存了一份局部变量)
3、减少参数的传递。
原理:
每个线程内部都有一个Map,每定义一个ThreadLocal变量,就相当于往Map里放了一个key,并定义一个对应的value每当使用ThreadLocal,就相当于get(key),寻找其对应的value。
2、底层方法:
① set方法
通过ThreadLocal对象的set方法,把ThreadLocal对象自己当做key,放进了ThreadLoalMap中。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);//不存在就创建
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
//Thread类里默认threadLocals为null
class Thread implements Runnable{
ThreadLocal.ThreadLocalMap threadLocals = null;
}
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
}
void createMap(Thr