ThreadLocal作用
为每一个线程创建一个数据的副本,各线程间是数据之间的操作互不影响,形成数据隔离的效果
ThreadLocal原理
ThreadLocal会为每一个线程创建一个ThreadLocalMap对象并赋值给该线程的threadLocals属性,ThreadLocalMap可以当作一个map,他的key是当前ThreadLocal对象,value就是该线程set进出的值。所以每个线程set进出的值都会保存在该线程的threadLocals中。
ThreadLocal代码
public void set(T value) {
Thread t = Thread.currentThread();//获取当前操作的线程
ThreadLocal.ThreadLocalMap map = this.getMap(t);//这个getMap其实就是返回t.threadLocals
if (map != null) {
map.set(this, value);//key=当前ThreadLocal对象
} else {
this.createMap(t, value);//当前t.threadLocals为null就new一个ThreadLocalMap 对象给他,并且把值放进去。
}
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocal.ThreadLocalMap map = this.getMap(t);获取当前线程的threadLocals
if (map != null) {
ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
T result = e.value;
return result;
}
}
return this.setInitialValue();//执行set(null),然后返回null
}