ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。
1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。
2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。
3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。
4、ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。
- set和setInitialValue几乎一致,不同的是:set操作会传入需要设置的value。而setInitialValue需要通过initialValue()获取初始值。
- 调用createMap方法创建threadLocals,createMap方法不仅创建了threadLocals,同时也将要添加的本地变量值添加到了threadLocals中。
- InheritableThreadLocal类继承了ThreadLocal类,并重写了childValue、getMap、createMap三个方法。其中createMap方法在被调用(当前线程调用set方法时得到的map为null的时候需要调用该方法)的时候,创建的是inheritableThreadLocal而不是threadLocals。同理,getMap方法在当前调用者线程调用get方法的时候返回的也不是threadLocals而是inheritableThreadLocal。
- 调用createInheritedMap将父线程的inheritableThreadLocals作为构造函数参数创建了一个新的ThreadLocalMap变量,然后赋值给子线程。
- 通过继承InheritableThreadLocal实现子线程从父线程中获取值, 此时如果需要修改子线程的值,则通过重写childValue方法来设置子线程的值 注:如果子线程在取得值的同时,主线程将InheritableThreadLocal中的值进行更改, 那么子线程取得的值还是旧的值