网上很多对threadLocal的解释,源码很容易阅读,但说的有点晕。
我的理解:threadLocal是线程里维护变量的,threadLocal无论被使用多少次都是不会变化的对象,除非new ThreadLocal() 多次,就会同时存在多个threadLocal对象。
Thread、ThreadLocalMap、ThreadLocal 三者就是这样的对应关系,即Thread里包含一个ThreadLocalMap属性,ThreadLocalMap可以同时包含多对Entry<ThreadLocal, Object>
也就是说一个线程Thread,可以同时使用多个threadLocal对象,存储多组数据。
结合ThreadLocal的源码理解:
以上代码,this对象是ThreadLocal,所以先获取当前线程Thread,再获取线程里的ThreadLocalMap,再以ThreadLocal作为key存入变量Value。
代码,this对象是ThreadLocal,所以先获取当前线程Thread,再获取线程里的ThreadLocalMap,再以ThreadLocal作为key获得变量Value。
所以说,只要你创建一个ThreadLocal对象,ThreadLocal threadLocal = new ThreadLocal();
set值 threadLocal.set("123");
在线程跟threadLocal是对应的的情形下,一定能get到你存进去的值 threadLocal.get();
如果线程跟threadLocal是不对应的的情形下,只能获取初始值(默认值null)
setInitialValue() -- null
protected T initialValue() { return null; }
Entry对象是若引用对象WeakReference,可以快速被GC回收。比如一个请求或线程执行完,线程里的threadlocalmap和Entry[] 可以被快速回收,而不用手动remove值。