ThreadLocal 类在线程中的作用相当于 Session,其常用方法有三个:set、get、remove
ThreadLocal 源码
set
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,存储着当前线程全部 ThreadLocal(存储键值对);然而这些集合 ThreadLocalMap 也是需要管理的
- 当前线程作为一个标识可以找到对应的 ThreadLocalMap
map.set(this, value);
调用 set 方法时只需要传递参数 value 即可,键就是 this(调用该方法的对象)
get
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();
}
remove
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null) {
m.remove(this);
}
}
浅谈 ThreadLocal
- 通过当前线程,从线程的某管理类中获取 ThreadLocalMap
- 一个线程通过 ThreadLocalMap(是 ThreadLocal 的内部类)存储了多个方法的 ThreadLocal
ThreadLocal 存储键值对,但是键是固定的(调用该方法的类),所以调用该方法的类只能存储一个值(可以是任意类型),
一个方法如果想存储多个值,就需要将这些值包装起来(数组、集合、domain、…),变成一个值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)