ThreadLocal是什么?子线程能否获取到父线程ThreadLocal变量中的值?
一、ThreadLocal简介
ThreadLocal 是一个本地线程副本变量工具类,在每个线程中都创建了一个 ThreadLocalMap 对象,简单说 ThreadLocal 就是一种以空间换时间的做法,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。
二、数据结构
Thread
类有一个类型为ThreadLocal.ThreadLocalMap
的实例变量threadLocals
,也就是说每个线程有一个自己的ThreadLocalMap
。
ThreadLocalMap
是一个Entry类型的数组存的是键值对,并且key
为弱引用。因为当前线程的ThreadLocalMap里面的ThreadLocal变量的弱引用在gc的时候就被回收,但是对应的value还是存在的这就可能造成内存泄漏(因为这个时候ThreadLocalMap会存在key为null但是value不为null的entry项)。所以要在使用完毕需要将其remove掉。
三、过期key的数据清理方式
- 探测式清理
- 启发式清理
四、子线程能否获取到父线程ThreadLocal变量中的值
同一个ThreadLocal变量在父线程中被设置值后,在子线程中是获取不到的。(threadLocals中为当前调用线程对应的本地变量,所以二者自然是不能共享的),但是 InheritableThreadLocal类则可以做到这个功能