ThreadLocal是什么?
线程级别的存储工具,是一个线程本地变量,它可以为每一个线程都创建一个私有的变量,每个线程只能获取到自己的变量,从而避免了线程安全问题。
ThreadLocal 的核心是 ThreadLocalMap 类,它是一个线程级别的哈希表,用于存储每个线程的变量。ThreadLocalMap 以 ThreadLocal 对象作为 key,以变量值作为 value,每个线程都可以通过 ThreadLocalMap 获取自己的变量。
ThreadLocal 的使用场景比较广泛,一般适用于以下情况:
1.需要保存线程的上下文信息,例如 用户信息,通过token解析出来的用户id等 ;
2. 需要对线程的局部变量进行隔离,避免线程安全问题;( LocalDate LocalDateTime)
3. 需要在跨类跨方法使用同一个变量,同时又不希望使用全局变量的情况;
4. 需要避免传递参数的繁琐,例如在 Spring 框架中使用的事务管理。
需要注意的是,由于 ThreadLocal 存储数据的副本是存储在每个线程的 ThreadLocalMap 中的,因此需要及时清理 ThreadLocal 中存储的数据,以避免内存泄漏问题。通常可以在使用完毕后通过调用 ThreadLocal 的 remove() 方法来清理数据,或者使用 Java 8 引入的新特性 ThreadLocal.withInitial() 方法来避免使用 remove() 方法。