接下来来看 Threadlocal.get
源码的实现:
public T get() { // 得到当前的线程 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); // 判断 ThreadLocal 中是否有数据 if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; // 有 set 值,直接返回数据 return result; } } // 执行初始化方法【重点关注】 return setInitialValue(); } 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; }
从上述源码可以看出,当 ThreadLocal
中有值时会直接返回值 e.value
,只有 Threadlocal
中没有任何值时才会执行初始化方法 initialValue
。
注意事项—类型必须保持一致
注意在使用 initialValue
时,返回值的类型要和 ThreadLoca
定义的数据类型保持一致,如下图所示:
如果数据不一致就会造成 ClassCaseException
类型转换异常,如下图所示: