TreadLocal是什么?能做什么?实现原理是什么?
这个问题困扰了很长一段时间,了解过一些后又忘了。今天突然想仔细了解深入一点到底它是个什么东西,感觉自己也有一知半解了,所以想把它记录下来。
其实理解ThreadLocal并不难,因为ThreadLocal它不是独立使用的,只有线程调用的时候才会体现它的价值。
Thread类里面维护着一个map,叫ThreadLocalMap。这个map的结构是ThreadLocal对象为key,线程的本地副本变量为value。这里的ThreadLocal是一个弱引用。什么是弱引用就是在gc的时候有可能会被回收的对象。后面会提到关于ThreadLocal的内存泄露问题。所以当我们在获取线程的本地变量值的时候,只会获取到当前线程的。因为每个Thread里面都有一个这样的map。
关于内存泄漏是因为当我们的map里的key——ThreadLocal生命周期和value不同,当gc的时候如果threadLocal被回收,而强引用线程对象还在执行,我们的value是没有价值的且不会被gc的。所以会造成内存泄漏。那么问题来了,如果我们的value也是一个弱引用,是不是会避免内存泄漏问题。答案是不一定。因为前面提到弱引用在gc的时候回收是有可能,而不是一定被回收。希望有人能帮忙解读一下为什么ThreadLocalMap的value为什么不是一个弱引用。
当然我们可以在调用ThreadLocal的get、set方法是最后remove掉这个对象可以避免内存泄漏了。