ThreadLcal就是一个线程中能够存储数据的Map结构,在同一个线程中,这个Map结构中的数据会被共享.
API:
threadLocal的三个方法:
set (参数); 这个参数就是想要存储的数据
get(): 获取存储的数据
remove() 删除存储的数据(释放资源)
底层结构基于数组+红黑树 (与MAP集合的区别:底层没有链表)
上图介绍的是最经典的ThreadLocal用法,浏览器发送请求,在拦截器里我们可以将请求头携带的信息放在ThreadLocal的Map结构中,在此线程后续的操作中在线程走过的任意位置都可以获取到这个Map结构中的值.
应用场景:我们可以从前端发出的请求头里获取到token值,解析token将从token获取的值存储到这个Map结中,比如操作人的id,用户名等信息.添加到数据中记录下来.
缺点:只支持单线程,ThreadLocal属于线程,所以在多线程的情况下不适用.并且这个存储的key值是属于弱引用对象,JDK的底层有个垃圾回收器.在弱引用不被使用时,会被垃圾回收器回收掉.但是value 值不会被回收,这个时候就会有一个内存泄漏的问题.
解决内存泄漏的办法,在使用完毕后,调用remove方法回收掉.一般在前端视图渲染完毕之后进行销毁.
其实弱引用在被使用时就不再是弱引用,会变成强引用.因为在使用,垃圾回收器不会回收.