ThreadLocal基本原理
一、定义
ThreadLocal是java中所提供的线程本地存储机制,可以利用改机制将数据缓存在线程内部,该线程可以在任意时刻、任意方法中获取数据
二、底层原理
ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象中都存在一个ThreadLocalMap,此Map的key为ThreadLocal对象,Map的value为需要缓存的值
三、ThreadLocal易造成的内存泄漏
内存泄漏原因
如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使用完成以后,应该要把设置的key,value也就是Entry对象进行回收,但线程池中的线程不会被回收,而线程对象是通过强引用指向ThreadLocalMap,而ThreadLocalMap也是强引用指向Entry对象,线程不会被回收那么Entry也就不会被回收。从而出现内存泄漏。
解决办法
在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除Entry对象。
四、使用场景
1.spring中的事务管理器就是使用了ThreadLocal
2.在拦截器中存储登录用户的信息,那么在该线程的任意方法中就可以取出
3.参数传递,a调b,b调c,为了传递某参数,可以放在ThreadLocal中
4.pageHelper的pageHelper.startPage(m,n);他是存在ThreadLocal中的,在mybatis拦截器里面再拿出来拼接SQL
五、InheritableThreadLocal与TransmittableThreadLocal
InheritableThreadLocal主要用于子线程创建时,需要自动继承父线程的ThreadLocal变量,方便必要信息的进一步传递
TransmittableThreadLocal 在使用线程池等会缓存线程的组件情况下传递ThreadLocal