线程-线程本地存储
ThreadLocal内部结构
1 | public void set(T value) { |
当调用 ThreadLocal 的 set 方法检查当前线程线程的 threadLocals 的是否被初始了,如果没有则调用 createMap 进行初始化。
然后将 ThreadLocal 变量当做 key, set 到线程的 threadLocals 这个Map中。
所以每一个线程 new 的 ThreadLocal 都是与其所在的线程有关的。这样就做到了线程安全。
当调用 ThreadLocal 的 get 方法时: 就从当前线程的 Map 中以 ThreadLocal 对象作为 key 来获取其所对应的 value.
线程的 threadLocals 变量
1 | /* ThreadLocal values pertaining to this thread. This map is maintained |
初始化
1 |
|
由 setInitialValue 的实现可知,可以通过 继承类 ThreadLocal 并 override 其 initialValue 方法,给这个 ThreadLocal 提供一个初始值。这样,如果 ThreadLocal 变量在没有调用 set 的前提下,调用 get 方法时这个 初始值将被 set 到 Map 中,同时由 get 返回。
对 null 的支持
由 ThreadLocal.ThreadLocalMap.set 方法的实现可知,对于 value 是支持 null 值的。
所以,下面的调用
1 | tLocal.set(null); |
将以 <tLocal, null> 键值对存储到当前线程的 Map 中。