ThreadLocal字段意义为线程本地,其实表达不够准确,应该为线程本地变量或线程局部变量更合适一些。
ThreadLocal 常用来存储每个线程的私有信息,相当于是线程组的私有变量容器,每个变量值为单一线程私有,不被其他线程共享。
ThreadLocal类的方法解析:
protected T initialValue() {
return null;
}
initialValue方法用来初始化线程变量容器的数据,相当于调用了set方法设置线程实例与变量的关联关系,此方法在需要初始化时可以被覆盖, 实现具体的初始化数据逻辑。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
get方法用来获取ThreadLocal的本地变量容器的值, 当ThreadLocalMap不为null时,返回ThreadLocalMap里的值,当ThreadLocalMap为null时,返回initialValue方法的初始值。
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
setInitialValue方法用来设置初始化值,把初始值放入ThreadLocalMap里,这里可以看出,ThreadLocal的变量容器为ThreadLocalMap, ThreadLocalMap为一种为ThreadLocal订制的HashMap。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
set方法用来为线程容器设置变量值。
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
remove方法用来移除ThreadLocal的容器ThreadLocalMap中设置的变量值。
小结:
ThreadLocal用来多线程场景下,使用ThreadLocalMap来保证线程的安全性和隔离性,保证了线程变量的私有性,比如可以存放每个线程对应的jdbc的connetion,或存储每个线程的序列号。