存储原理:
线程Thread中有成员变量ThreadLocalMap,是一个对象,不是一个map
ThreadLocalMap中有一个内部类Entry,类似于Map的Entry,但是Entry继承了WeakReference,entry的reference就相当于map的key,是弱引用,value就相当于map的value,是强引用。
ThreadLocalMap中持有Entry的数组Entry[ ],用于保存Thread不同的ThreadLocal。
Entry的key是ThreadLocal对象经过hash运算的值,value就是ThreadLocal的范型对象
例如:ThreadLocal<List< User >> userThreadLocal = new ThreadLocal<>(); entry对象里存储的reference就是userThreadLocal经过hash运算得到的值用于寻址,value就是List< User > 。
内存泄漏:
entey对象中是使用弱引用存储的ThreadLocal,当threadLocal没有强引用时,threadLocal会被回收,导致entry中存在key = null的value,由于Thread仍然存活,thread持有ThreadLocalMap,ThreadLocalMap持有Entry数组,导致此entry无法被回收,举例:
如果线程多次执行,会导致OOM
每次调用threadLocal的get()、set()、remove(),都会尝试清空key = null的entry,也是在防止内存泄漏。但是当线程不再使用threadLocal相关方法,就会导致内存无法被回收。