概念
该类主要用于不同线程存储自己的线程本地变量.ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境下,如何防止自己的变量被其它线程篡改。
set方法
private T setInitialValue() {
// 初始化值的方法 返回null
T value = initialValue
// 获取当前线程对象
Thread t = Thread.currentThread();
// 获取线程的ThreadLocalMap
//ThreadLocalMap 是Thread的一个内部类,类似于map的结构
ThreadLocalMap map = getMap(t);
// 如果map不是null覆盖掉之前的值
if (map != null)
map.set(this, value);
// 如果map是null 创建新的map并赋值
else
createMap(t, value);
return value;
}
initialValue 初始化值的方法
protected T initialValue() {
return null;
}
getMap 获取ThreadLocalMap
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
createMap 创建map的方法 , firstValue 就是第一次调用set方法传递的值
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
get方法
*/
public T get() {
// 获取当前线程
Thread t = Thread.currentThread();
// 获取 ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
// 如果map不是null, 获取 Entry 结构类似于键值对
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
// 如果entry不是null ,获取value返回
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
// 设置初始化值null 返回
return setInitialValue();
}
remove方法 删除
使用完ThreadLocal ,最好手动调用 remove() 方法,防止出现内存溢出,因为中使用的key为ThreadLocal的弱引用, 如果ThreadLocal没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,但是如果value是强引用,不会被清理, 这样一来就会出现 key 为 null 的 value。
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
// 通过 this本类对象 进行删除
m.remove(this);
}
ThreadLocalMap
ThreadLocalMap是 Thread 的一个静态内部类, 结构类似于map, 他的key 是 this,即调用方法的当前对象,
通过这个对象使每个线程中都有自己的