ThreadLocal总结

  1. 1. ThreadLocal 使用场景
    1. 1.1. 1. 全局存储用户信息(项目中用到)
    2. 1.2. 二、ThreadLocal内存泄露问题

ThreadLocal 使用场景

1. 全局存储用户信息(项目中用到)

​ 在前后端分离的项目中,分离之后如何获取用户信息就成了一件麻烦事,通常在用户登录后, 用户信息会保存在Session或者Token中。这个时候,我们如果使用常规的手段去获取用户信息会很费劲,拿Session来说,我们要在接口参数中加上HttpServletRequest对象,然后调用 getSession方法,且每一个需要用户信息的接口都要加上这个参数,才能获取Session,这样实现就很麻烦了。

​ 在项目中使用ThreadLocal,会选择在拦截器的业务中, 获取到保存的用户信息,然后存入ThreadLocal,那么当前线程在任何地方如果需要拿到用户信息都可以使用ThreadLocal的get()方法 (异步程序中ThreadLocal是不可靠的)

​ 对于笔者而言,这个场景使用的比较多,当用户登录后,会将用户信息存入Token中返回前端,当用户调用需要授权的接口时,需要在header中携带 Token,然后拦截器中解析Token,获取用户信息,调用自定义的类存入ThreadLocal中,当请求结束的时候,将ThreadLocal存储数据清空, 中间的过程无需在关注如何获取用户信息,只需要使用工具类的get方法即可。

​ 当某对象用ThreadLocal包装过后,就可以保证在该线程中独此一份,同时和其他线程隔离。

二、ThreadLocal内存泄露问题

内存泄露问题: 指程序中动态分配的堆内存由于某种原因没有被释放或者无法释放,造成系统内存的浪费,内存泄露堆积将会导致内存溢出。导致程序运行速度减慢或者系统奔溃等严重后果。

​ 所以使用完ThreadLocal ,最好手动调用 remove() 方法,防止出现内存溢出,因为ThreadLocalMap中使用的key为ThreadLocal的弱引用, 如果ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,但是如果value是强引用,不会被清理, 这样一来就会出现 key 为 null 的 value。