基于ThreadLocal的内部结构,我们继续分析它的核心方法源码,更深入的了解操作原理。
除了构造方法之外,ThreadLocal对外暴露的方法有以下4个:
方法声明 | 描述 |
protected T initialValue() | 返回当前线程局部变量的初始值 |
public void set(T value) | 设置当前线程绑定的局部变量 |
public T get() | 获取当前线程绑定的局部变量 |
public void remove() | 移除的当前的线程绑定的局部变量 |
以下是这4个方法的详细源码分析
/**
将该线程局部变量的当前线程副本设置为指定的值。大多数子类都不需要重写这个方法,只依赖于initialValue方法来设置线程局部变量的值。
参数:
Value -要存储在当前线程本地线程的副本中的值。
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
/**
返回该线程局部变量的当前线程副本中的值。如果变量在当前线程中没有值,则首先将其初始化为initialValue方法调用所返回的值。
返回:
这个线程本地的当前线程值
*/
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();
}
/**移除此线程局部变量的当前线程值。如果这个线程局部变量随后被当前线程读取,它的值将通过调用它的initialValue方法重新初始化,除非它的值是由当前线程在中间设置的。这可能导致在当前线程中多次调用initialValue方法。
自:
1.5
*/
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
/**
set()的变体来建立initialValue。当user覆盖了set()方法时,用它代替set()。
返回:
初始值
*/
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;
}